Django:如何向后跟随 ForeignKey('self')

Posted

技术标签:

【中文标题】Django:如何向后跟随 ForeignKey(\'self\')【英文标题】:Django: How to follow ForeignKey('self') backwardsDjango:如何向后跟随 ForeignKey('self') 【发布时间】:2010-11-10 00:59:45 【问题描述】:
class Achievement(MyBaseModel):
    parent_achievement = models.ForeignKey('self', blank=True, null=True, help_text="An achievement that must be done before this one is achieved") # long name since parent is reserved

我能做到:

Achievement.objects.get(pk="1").parent_achievement

这很棒。但是我怎么才能得到所有的孩子呢?

Achievement.objects.get(pk="1").parent_achievement_set

不起作用(可能应该有更多的符号),我在搜索时没有看到太多。

有可能吗?陷入SQL?

【问题讨论】:

【参考方案1】:

默认情况下,django 会反向调用模型名称,后跟“_set”,所以会是

Achievement.objects.get(pk="1").achievement_set

如果这不适合您,请使用related_name 可选参数到models.ForeignKey

class Achievement(MyBaseModel):
    parent_achievement = models.ForeignKey(
        'self', 
        blank=True, 
        null=True, 
        help_text="An achievement that must be done before this one is achieved",
        related_name="child_achievement_set"
    ) # long name since parent is reserved

Achievement.objects.get(pk="1").child_achievement_set

【讨论】:

【参考方案2】:

不知道这是否是最好的方法,但这也可以完成工作

Achievement.objects.filter(parent_achievement=1)

Achievement.objects.filter(parent_achievement__pk=1)

【讨论】:

以上是关于Django:如何向后跟随 ForeignKey('self')的主要内容,如果未能解决你的问题,请参考以下文章

Django 使用 ForeignKey 形成单元测试

Django:如何获取列表相关的 ForeignKey 记录?

在 Django 中,如何将 ForeignKey 传递给 Model 的实例?

Django 如何使 ForeignKey 使用默认值?

如何使用 django 向默认 auth_user 模型添加额外的模型字段

Django:如何从 ManyToMany 迁移到 ForeignKey?