Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Как организовать в django отношение «родитель -- дочерняя запись» в models красиво?

Собственно хочется "красивую" models для отношений "родитель -- дочерняя запись" внутри одной таблице. Вот так ругается:

class Person (models.Model):
    FullName = models.CharField ( default=u"Иванов И.И.", max_length=256 )
    # ...
    Parent = models.OneToOneField ( Person )

    def __unicode__(self):
        return self.FullName

Скорее всего получится устанавливать отношение "родитель -- дочерняя запись" в ручную, например:

class Person (models.Model):
    id = models.IntegerField ( primary_key=True )
    FullName = models.CharField ( default=u"Иванов И.И.", max_length=256 )
    # ...
    Parent = models.IntegerField ( default=0, db_index=True )

    def __unicode__(self):
        return self.FullName

Но очень хочется "красивости".

Собственно все это нужно чтобы не переписывать записи, в которых много индексированных полей. Перезапись индексов будет подтормаживать, а если просто добавлять новую запись а у старой менять Parent , то это перестроение всего одного индекса (Parent же тоже придется индексировать, чтобы после быстро выбирать записи с Parent == 0)
  • Вопрос задан
  • 2991 просмотр
Решения вопроса 1
sim3x
@sim3x
Ты бежишь впереди паровоза

Вот такое не надо
id = models.IntegerField ( primary_key=True )
оно само делается ОРМ

OneToOne это не про то. Это поле, которое связывает две модели, которые по некоторым обстоятельствам были разделены. Раньше их часто употребляли для связи захардкоженной модели User и UserDetails с доп полями, которые нужны были разрабу

FullName
CamelCase - для классов
under_score - для переменных, полей модели и тд

class Person(models.Model):
    full_name = models.CharField( default=u"Иванов И.И.", max_length=256 )
    # ...
    parent = models.ForeighKey('self', blank=True, null=True)
    # or
    # parent = models.ForeighKey("Person", blank=True, null=True)


то это перестроение всего одного индекса

Но как и раньше - решаешь проблемы, которой еще нет
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Rrooom
@Rrooom
А погуглить?

Отношение к самому себе устанавливается с помощью строки "self".

А еще лучше использовать django-mptt.
Ответ написан
@denizen
попробуйте django-mptt
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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