如何在数据库上激活/使用django-mptt?

时间:2014-12-19 21:15:27

标签: python django django-1.7 django-mptt

我有一个带有offices表的现有数据库。它包含以下字段:

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


修改django-mptt我还想使用其他一些便利功能,所以我正在寻找有关如何实施{的建议使用现有表{1}}修改表 in situ ,以便我可以在不迁移的情况下使用django-mptt,或创建新表,然后将数据加载到其中。理想情况下,我可以更改现有表,然后使用django-mptt而无需运行Django迁移。

1 个答案:

答案 0 :(得分:2)

如果你只是想为父母生孩子,就不需要mpt。该功能内置于Django:给定一个名为my_office的Office实例,您可以使用my_office.office_set.all()来获取其子项。

您可能希望为反向访问者提供更好的名称,您可以通过修改字段定义来执行此操作:

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

现在你可以my_office.children.all()