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 :)
Другие вопросы по тегам