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.

Вернуться на верх