带有查询表达式的 class 的 Django 隐式字段命名 - 它是如何工作的?

Django implicit field naming for class with query expression - how does it work?

我今天写的简化示例:

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 文档 link 那将是理想的 。谢谢。

Why is it Count('childsomething') instead of Count('child_something')?

Django 使用 related_query_name=… parameter [Django-doc] 来指定反向关系。如果您因此在名为 parentChildSomethingForeignKey 中指定 related_query_name='child_something',那么这将有效。

如果您没有为 related_query_name=… 参数填写值,那么 Django 将查找 related_name=… parameter [Django-doc],它也用于反向访问关系。

如果两个都不填,Django会自动为related_query_name=…参数构造一个值,即class的名字,其中ForeignKey定义为小写,所以对于 ChildSomething,就是 childsomething.

如果你想用 child_something 来指定它,你应该在构造 ForeignKey.[=30 时覆盖 related_query_name=… 参数或 related_name=… 参数=]