我有一个带有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迁移。
答案 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()
。