Django-mptt, абсолютно ошибочный или я делаю его неправильно?

Я пытаюсь использовать django-mptt с очень небольшой удачей. Это с Python2.5, окнами, sqlite3, Django 1.2pre, django-mptt последнее от svn.

Код:

модель:

class Node(models.Model):
    name   = models.CharField(max_length=20, blank=True)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')

    def __unicode__(self):
        return self.name

mptt.register(Node)

установка:

nodes = []
for i in range(15):
    n = Node(name='node'+str(i))
    n.save()
    nodes.append(n)

nodes[0].move_to(None)
nodes[0].save()
for n in range(1,15):
    nodes[n].move_to(nodes[(n-1)/2],'last-child')
    nodes[n].save()

Это должно создать дерево с одним корнем и двумя детьми, зависающими прочь каждого узла, не являющегося листом.

Теперь забава начинается:

>>> nodes[0].children.all()
[, ]
>>> nodes[0].get_descendants()
[]

>>> nodes[0].get_descendants(True)
[, ]


>>> for n in nodes:
...     print n, n.get_ancestors()
...
node0 []
node1 []
node2 []
node3 [, ]
node4 [, ]
node5 [, ]
node6 [, ]
node7 [, , ]
node8 [, , ]
node9 [, , ]
node10 [, , ]
node11 [, , ]
node12 [, , ]
node13 [, , ]
node14 [, , ]

Почему столь многие предки неправильно? Например, узел 10 должен иметь предков, (0,1,10)

Я делаю что-то не так или являюсь там ошибками в django-mptt?

7
задан Parand 28 January 2010 в 07:12
поделиться

1 ответ

Я бы не сказал бы Это багги, но есть куча, которую вам нужно знать.

Когда вы добавляете ребенка на родитель, атрибуты дерева ребенка правильно обновляются с помощью MPTT-специфики LFT , RGHT и уровнем значения.

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

Это означает, что следующий ребенок, который вы добавляете в родительский объект, получат неправильные левые и правильные значения, и если вы впоследствии сохраните родитель, который также будет иметь неправильные значения.

Решение состоит в том, чтобы перезагрузить родитель из базы данных каждый раз, когда добавить ребенка:

for n in range(1,15):
    parent_pos = (n-1)/2
    parent = nodes[parent_pos]
    nodes[n].move_to(parent, 'last-child')
    nodes[n].save()
    nodes[parent_pos] = Node.objects.get(pk=parent.pk)
14
ответ дан 6 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

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