Django: Как следовать за 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") # 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)