Я получил эту ошибку, когда для восстановления Db недостаточно места на диске. Очистка некоторого пространства решила его.
Вам нужны две модели, а не 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
была девушка.