Как представить семейные отношения в Django, используя manyToMany и inlineformset?

Я получил эту ошибку, когда для восстановления Db недостаточно места на диске. Очистка некоторого пространства решила его.

0
задан WillOnami 5 March 2019 в 16:26
поделиться

1 ответ

Вам нужны две модели, а не 3, потому что вы на самом деле связываете человека с человеком.

class Person(Model):
    name = ...
    family_members = ManyToManyField('self', through=FamilyMemberRelationship, through_fields=('person', 'relation'))

class FamilyMemberRelationship(Model):
    person = ForeignKey(Person, on_delete=CASCADE, related_name='relationships')
    related = ForeignKey(Person, on_delete=CASCADE, related_name='reverse_relationships')
    relation_type = CharField(max_length=3, choices=FAMILYRELATION_CHOICE)

Обратите внимание, что отношения не симметричны. Теперь, если у вас есть phil и james брат Фила, то вы можете сделать:

relation = FamilyMemberRelationship(person=phil, related=james, relation_type='brother')
relation.save()
phil.family_members.all()  # james
phil.relations.filter(related=james).first().relation_type  # "brother" 
james.family_members.all()  # phil

Единственное, что здесь есть, это то, что тип_отношения имеет направление (не симметричное), так что вы можете ' t:

james.relations.filter(related=phil).first()  # None

, но вы можете:

james.reverse_relations.filter(related=phil).first().relation_type  # "brother"

Возможно, вы захотите сохранить reverse_relation_type, чтобы у вас была «сестра», если phil была девушка.

0
ответ дан dirkgroten 5 March 2019 в 16:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: