Django: хранить иерархические данные
Я пытаюсь сохранить разделы документа в приложении Django. Модель выглядит так:
class Section(models.Model):
project = models.ForeignKey(Project)
parent_section = models.ForeignKey('Section', blank=True, null=True, related_name='child_set')
predecessor_section = models.ForeignKey('Section', blank=True, null=True, related_name='predecessor_set')
name = models.CharField(max_length=100)
text = models.TextField(blank=True, null=True)
Я создаю множество разделов, связываю их (parent_section, precessor_section) и сохраняю их, вызывая каждый из их методов сохранения. Тем не менее, когда я смотрю в таблицу после ее сохранения, parent_section_id и beforecessor_section_id не устанавливаются, даже если перед сохранением к ним были прикреплены объекты.
Я предполагаю, что это связано с тем фактом, что некоторым экземплярам parent_section не назначен идентификатор, поскольку их экземпляр еще не сохранен, но использование транзакций вручную не может решить проблему.
Есть мысли по этому поводу?
Ура, Макс
2 ответа
Объекты не имеют идентификатора, пока вы не сохраните их в Django ORM.
Поэтому я бы сказал, что вам нужно сохранить () объект, а затем сослаться на него в родительских / дочерних разделах (и повторно сохранить разделы).
Тем не менее, еще один вариант сохранения указателей prec и next в качестве указателей заключается в сохранении sequence_index (с интервалом 10, чтобы разрешить дополнительные вставки без переупорядочения) и упорядочения по этому индексу.
Попробуйте выполнить save() для всех объектов, затем обновите их отношения, а затем снова сохраните () все из них.
Когда вы назначаете внешний ключ, идентификатор связанного (целевого) объекта копируется. так как в момент назначения отношений (parent_section, precessor_section) у связанных объектов еще нет идентификатора, вы получите забавный результат:
A = Section(name='A')
B = Section(name='B')
B.parent_section = A
A.save()
B.save()
B.parent_section # this will say A
B.parent_section_id # this will say **None**
Но это должно работать:
A = Section(name='A')
B = Section(name='B')
A.save()
B.save()
B.parent_section = A
B.parent_section # this will say A
B.parent_section_id # this will say A.id
B.save() # don't forget this one :)