#python #django #django-models #django-admin
Вопрос:
Я работаю в Django с моделью (проверкой) с внешним ключом.
client_id = models.ForeignKey(Client, on_delete=models.CASCADE)
Все отлично работает с обычной регистрацией администратора, но когда я использую class ChecksAdminSite
, она выходит из строя. Вот клиентская модель:
class Client (models.Model):
def __str__(self):
return self.name ' ' self.surname
name = models.CharField(max_length=120)
surname = models.CharField(max_length=120, null=True)
phone = models.PositiveIntegerField(null=True)
mail = models.EmailField(null=True)
sport = models.TextField(blank=True, null=True)
gender_options=(
("F", "femenino"),
("M", "masculino"),
)
gender = models.CharField(max_length=120, null=True, choices=gender_options)
birth = models.DateField(null=True)
def get_absolute_url(self):
return reverse("clientes:cliente", kwargs={"client_id": self.id})
pass
Итак, когда я вхожу в конкретный элемент администратора, он отображает следующую ошибку:
Поле «идентификатор» ожидало номер, но получило <Клиент: Хуан Орхуэла>. (Хуан Орхуэла-это имя и фамилия этого конкретного предмета).
Я просто не могу найти решение или ошибку. Кто-нибудь может мне помочь?
Спасибо!
Редактировать
Добавлена трассировка стека:
Traceback (most recent call last):
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangocorehandlersexception.py", line 47, in inner
response = get_response(request)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangocorehandlersbase.py", line 204, in _get_response
response = response.render()
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplateresponse.py", line 105, in render
self.content = self.rendered_content
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplateresponse.py", line 83, in rendered_content
return template.render(context, self._request)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebackendsdjango.py", line 61, in render
return self.template.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 170, in render
return self._render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 162, in _render
return self.nodelist.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 938, in render
bit = node.render_annotated(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplateloader_tags.py", line 150, in render
return compiled_parent._render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 162, in _render
return self.nodelist.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 938, in render
bit = node.render_annotated(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplateloader_tags.py", line 150, in render
return compiled_parent._render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 162, in _render
return self.nodelist.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 938, in render
bit = node.render_annotated(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplateloader_tags.py", line 62, in render
result = block.nodelist.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 938, in render
bit = node.render_annotated(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplateloader_tags.py", line 62, in render
result = block.nodelist.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 938, in render
bit = node.render_annotated(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatedefaulttags.py", line 211, in render
nodelist.append(node.render_annotated(context))
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplateloader_tags.py", line 192, in render
return template.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 172, in render
return self._render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 162, in _render
return self.nodelist.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 938, in render
bit = node.render_annotated(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatedefaulttags.py", line 211, in render
nodelist.append(node.render_annotated(context))
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatedefaulttags.py", line 211, in render
nodelist.append(node.render_annotated(context))
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatedefaulttags.py", line 312, in render
return nodelist.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 938, in render
bit = node.render_annotated(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatedefaulttags.py", line 312, in render
return nodelist.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 938, in render
bit = node.render_annotated(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
return self.render(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 988, in render
output = self.filter_expression.resolve(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 671, in resolve
obj = self.var.resolve(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 796, in resolve
value = self._resolve_lookup(context)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangotemplatebase.py", line 858, in _resolve_lookup
current = current()
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangocontribadminhelpers.py", line 196, in contents
f, attr, value = lookup_field(field, obj, model_admin)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangocontribadminutils.py", line 276, in lookup_field
attr = getattr(obj, name)
File "F:devfitnessfitnesschecksmodels.py", line 48, in client_check_age
client = Client.objects.get(pk=self.client_id)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelsmanager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelsquery.py", line 418, in get
clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelsquery.py", line 942, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelsquery.py", line 962, in _filter_or_exclude
clone._filter_or_exclude_inplace(negate, *args, **kwargs)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelsquery.py", line 969, in _filter_or_exclude_inplace
self._query.add_q(Q(*args, **kwargs))
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelssqlquery.py", line 1358, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelssqlquery.py", line 1377, in _add_q
child_clause, needed_inner = self.build_filter(
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelssqlquery.py", line 1319, in build_filter
condition = self.build_lookup(lookups, col, value)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelssqlquery.py", line 1165, in build_lookup
lookup = lookup_class(lhs, rhs)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelslookups.py", line 24, in __init__
self.rhs = self.get_prep_lookup()
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelslookups.py", line 76, in get_prep_lookup
return self.lhs.output_field.get_prep_value(self.rhs)
File "C:Usersorjue.virtualenvsfitness-w55kuZbnlibsite-packagesdjangodbmodelsfields__init__.py", line 1776, in get_prep_value
raise e.__class__(
TypeError: Field 'id' expected a number but got <Client: Juan Orjuela>.
Редактировать:
Вызов внешнего ключа и определение client_check_age.
client_id = models.ForeignKey(Client, on_delete=models.CASCADE)
@property
def client_check_age(self):
client = Client.objects.get(pk=self.client_id)
client_check_age = round(((date.today() - client.birth)/timedelta(365)), 2)
return client_check_age
Комментарии:
1. Не могли бы вы вставить всю трассировку стека и код для формы администратора и/или admin.py?
2. @DanielButler извините, я новичок в программировании и python. Трассировка стека отображается в веб-браузере или на терминале?
3. Эй, не беспокойся. Это тот, что в терминале.
4. @DanielButler Это довольно долго: docs.google.com/document/d/…
5. Лучше всего отредактировать вопрос и добавить к нему трассировку стека
Ответ №1:
Как правило, при использовании внешнего ключа в django это означает, что объект будет находиться в атрибуте. Если вы исходите из фона sql foreignkey field
, он создает client_id
столбец в базе данных за кулисами. Хотя тебе никогда не придется беспокоиться об этом
client = models.ForeignKey(Client, on_delete=models.CASCADE)
@property
def client_check_age(self):
client = Client.objects.get(pk=self.client.id)
client_check_age = round(((date.today() - client.birth)/timedelta(365)), 2)
return client_check_age
Как только вы обновите этот код, вам захочется воссоздать миграции, а затем перенести базу данных.