Django неявное именование полей для класса с помощью выражения запроса - как это работает?
Упрощенный пример того, что я написал сегодня:
class Grandparent(models.Model):
text = models.CharField(max_length=5, choices=too_many)
class Parent(models.Model):
grandparent = models.ForeignKey(Grandparent, on_delete=models.CASCADE)
info = models.CharField(max_length=30)
class ChildSomething(models.Model):
parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
data = models.CharField(max_length=5, choices=chromosome_identities)
Задав определенный объект Grandparent, я хотел упорядочить объекты Parent под ним по большинству ChildSomething каждого Parent, что я успешно сделал ниже.
grandparent = Grandparent.objects.get(id=32923) # arbitrary id
# This query produces the desired result
parents = (
Parent.objects.filter(grandparent=grandparent).
annotate(num_child_somethings = Count('childsomething')).
order_by('num_child_somethings')
)
Мой вопрос: Почему это Count('childsomething') вместо Count('child_something')? Последнее было моей интуицией, которая была исправлена полезным сообщением об ошибке Django:
Exception Type: FieldError
Exception Value:
Cannot resolve keyword 'user_translation' into field. Choices are: id, translate_text, translate_text_id, translation, usertranslation
Ответ на этот вопрос, скорее всего, прост, просто я не смог найти ничего в документации, связанного с этим. Как работает соглашение об именовании? Если кто-нибудь знает соответствующую ссылку на документацию Django, это было бы идеально. Спасибо.
Почему это
Count('childsomething')
вместоCount('child_something')
?
Django использует параметр related_query_name=…
[Django-doc] для указания отношения в обратном порядке. Если бы вы таким образом указали related_query_name='child_something'
в ForeignKey
из ChildSomething
с именем parent
, то это бы сработало.
Если вы не заполните значение для параметра related_query_name=…
, то Django будет искать параметр related_name=…
[Django-doc], который также используется для обратного доступа к отношениям.
Если оба параметра не заполнены, Django автоматически построит значение для параметра related_query_name=…
, которое является именем класса, в котором определен ForeignKey
, в нижнем регистре, так что для ChildSomething
это просто childsomething
.
Если вы хотите указать это с помощью child_something
, вам следует переопределить параметр related_query_name=…
или параметр related_name=…
при построении ForeignKey
.