Django: хранить иерархические данные - PullRequest
4 голосов
/ 29 июля 2010

Я пытаюсь сохранить разделы документа в приложении 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 ]

0 голосов
/ 29 июля 2010

объекты не имеют идентификатора, пока вы не сохраните их в Django ORM.

Так что я бы сказал, что вам нужно сохранить () объект, а затем сослаться на него в родительских / дочерних разделах (и повторно сохранить разделы).

Тем не менее, другой вариант для хранения пред и следующего в качестве указателей - это сохранение sequence_index (с интервалом 10, чтобы разрешить дополнительные вставки без переупорядочения) и порядок по этому индексу.

0 голосов
/ 29 июля 2010

Попробуйте выполнить save () для всех объектов, затем обновите их отношения, а затем снова сохраните () все из них.

Когда вы назначаете внешний ключ, связанный (ID цели) копируется.так как в момент назначения отношений (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 :)
...