Пишу для себя приложение relatives
, которое предназначено для ведения дерева родственников.
Есть такие модельки (сокращённо):
SEX = enumerate([u'Мужской', u'Женский', ])
REL_TYPE = enumerate([u'Приёмные родители', u'Брак', ''])
class Person(models.Model):
father = models.ForeignKey('Person', related_name=u'my_father', null=True, blank=True)
mother = models.ForeignKey('Person', related_name=u'my_mother', null=True, blank=True)
fname = models.CharField(u'Фамилия', max_length=128, null=True, blank=True)
iname = models.CharField(u'Имя', max_length=128, null=True, blank=True)
oname = models.CharField(u'Отчество', max_length=128, null=True, blank=True)
sex = models.IntegerField(u'Пол', choices=SEX)
birth_year = models.IntegerField(u'Год рождения', null=True, blank=True)
birth_month = models.IntegerField(u'Месяц рождения', null=True, blank=True)
birth_day = models.IntegerField(u'День рождения', null=True, blank=True)
death_year = models.IntegerField(u'Год смерти', null=True, blank=True)
death_month = models.IntegerField(u'Месяц смерти', null=True, blank=True)
death_day = models.IntegerField(u'День смерти', null=True, blank=True)
relation = models.ManyToManyField('Person', related_name='children', through='Relation')
class Relation(models.Model):
src = models.ForeignKey('Person', related_name=u'related_src')
dst = models.ForeignKey('Person', verbose_name=u'С кем', related_name=u'related_dst')
begin_year = models.IntegerField(u'Год начала', null=True, blank=True)
begin_month = models.IntegerField(u'Месяц начала', null=True, blank=True)
begin_day = models.IntegerField(u'День начала', null=True, blank=True)
end_year = models.IntegerField(u'Год завершения', null=True, blank=True)
end_month = models.IntegerField(u'Месяц завершения', null=True, blank=True)
end_day = models.IntegerField(u'День завершения', null=True, blank=True)
otype = models.IntegerField(u'Связь', choices=REL_TYPE)
Такая организация моделей позволяет мне всяко разно связывать людей.
Но возник вопрос, как в админке через инлайны показать братьев и сестёр для редактируемого человека. Что-то я подвис...
Вроде бы всё можно решить через метод queryset
инлайна:
def queryset(self, request):
qs = super(BrotherRelationInline, self).queryset(request)
Но как-то надо передавать туда указатель на текущий объект.
Ещё одна проблема заключается в том, что из-за двух FK в модели Person
требуется в инлайне указать свойство fk_name
. Получается, что надо создавать один инлайн для братьев/сестёр по отцу и один для братьев/сестёр по матери. Но пока это не так важно из-за проблем с queryset
.
Нужна правильная мысль!