Django ORM查询中关联模型反向引用隐式命名规则疑问
Django反向关联默认命名规则说明
核心原因
Django 对未手动指定related_name参数的外键字段,会自动生成反向关联名称,生成规则为直接将子模型的类名全部转换为小写,不会自动将驼峰命名转换为蛇形命名。
你示例中的子模型类名为ChildSomething,全小写后得到的默认反向关联名就是childsomething,所以在Parent侧做聚合查询时需要用这个名称。你直觉想到的child_something是自行将驼峰类名转蛇形的结果,不符合Django的默认规则,因此会触发字段不存在的报错。
你贴出的报错信息也符合这个规则:你写的user_translation无法被识别,可选选项中存在的usertranslation正是子模型类名UserTranslation全小写后的结果。
自定义反向关联名的方案
如果想要使用符合你习惯的蛇形命名作为反向关联名,可以在定义外键时主动指定related_name参数:
class ChildSomething(models.Model): # 这里指定related_name后,Parent侧就可以用child_somethings做反向查询 parent = models.ForeignKey(Parent, on_delete=models.CASCADE, related_name='child_somethings') data = models.CharField(max_length=5, choices=chromosome_identities)
配置后你就可以用Count('child_somethings')完成聚合操作,符合日常命名习惯。
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

