2014-12-19 5 views
1

У меня есть существующая база данных с таблицей offices. Она имеет следующие поля:Как активировать/использовать django-mptt в базе данных с данными?

id 
lvl 
parent_id 
name 
code 

У меня есть модель Django (1,7), который выглядит как:

class Office(models.Model): 
    id   = models.IntegerField(primary_key=True) 
    lvl   = models.IntegerField(blank=True, null=False) 
    parent  = models.ForeignKey('self', null=True) 
    name  = models.TextField(blank=True) 
    code  = models.TextField(blank=True) 

    class Meta: 
     managed = False 
     db_table = 'offices' 

    def __str__(self): 
     return "(" + self.code + ") " + self.name + ", level " + str(self.lvl) 

В своей нынешней форме, называя someoffice.parent работает правильно и возвращает родителя. Тем не менее, мне нужно иметь возможность называть someoffice.children() и возвращать дочерние элементы отдельного родительского узла.

Это похоже на хороший вариант использования для django-mptt. Тем не менее, я не могу понять, как использовать django-mptt в существующей таблице моделей и баз данных без ошибок Django, связанных с отсутствующими миграциями. Я более чем счастлив отказаться от модели и/или заменить ее чем-то другим. То, что я не хочу делать, - это выбросить существующую таблицу, если я не смогу сделать это один раз и больше не буду бороться с этим.

Как я могу работать с существующей таблицей базы данных для реализации django-mptt?


Edit: Есть несколько других функций удобства в django-mptt я также хотел бы использовать, так что я ищу советы о том, как реализовать либо django-mptt с существующей таблицей, чтобы изменить таблицу in situ, так что я могу использовать django-mptt без переноса, или создать новую таблицу, а затем загрузить в нее мои данные. В идеале я могу изменить существующую таблицу, а затем использовать django-mptt без необходимости запуска миграции Django.

ответ

2

Нет необходимости в mptt, если вы просто хотите получить детей для родителя. Эта функциональность встроена в Django: с учетом экземпляра Office под названием my_office вы можете получить своих детей с my_office.office_set.all().

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

parent  = models.ForeignKey('self', null=True, related_name='children') 

Теперь вы можете сделать my_office.children.all().

+0

Хорошо, спасибо за информацию. Я не был всеобъемлющим в вопросе, поэтому я отредактирую его. В 'django-mptt' есть другие функции удобства, которые я мог бы использовать в шаблонах и т. Д., Поэтому я ищу способ реализовать это с помощью таблицы, которую у меня есть, и/или совета о том, следует ли мне создать новую таблицы и переноса данных в нее и т. д. – Clay