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)