django自引用模型,使用值0或null作为子表的根

时间:2011-05-26 17:38:00

标签: django django-models

我有一个PHP应用程序,我正在考虑重写Django或Rails(多年来做了一些maitence工作,但不熟悉这样的问题)。理想情况下,我希望db模式尽可能接近我正在使用的模式。它有一个模型,如下所示:

menu - id,name
menu_headers - id,menu_id,parent_menu_header_id,sort,name

getMenu($ id)函数中的逻辑是通过id获取菜单,然后使用corrent menu_id和parent_menu_header_id为0获取menu_headers。有一个子菜单函数被调用,获取基于的子菜单parent_menu_header_id。换句话说,0表示它是根menu_header(即select * from menu_headers,其中menu_id = $ menu_id,parent_menu_header_id = 0 order by sort)。这一切都被推送到memcache,因此性能不是问题。

我正在考虑将应用程序移至django并正在调查这将是多么困难/可能。

我目前有:

class Menu(models.Model):
    location=models.ForeignKey(Location)
    name = models.CharField(max_length=200)

class Menu_Header(models.Model):
    menu=models.ForeignKey(Menu)
    parent=models.ForeignKey('self',null=True,blank=True,related_name="children")

出现了一些问题。这不是一个真正的外键关系。看起来不支持复合外键。也许使用类似Root_Menu_Header的东西,它确实具有真正的fk关系。有没有更好的方法来模拟这个?我看过django-mptt,但认为这应该是可能的。有什么想法吗?

THX

- 编辑#2

我可能没有得到你所说的,但例如我现在有:

menu   
id    name  
1     test menu  

menu_header  
id  menu_id parent_id   name  
1   1       NULL        Wine  
2   1       1           Red  
3   1       1           White  

当我获得Menu对象时,它具有相同级别的所有3个菜单标题。所以这显然不能正常工作。我应该在视图级别操纵这个吗?或者是否应该在menu_header表中设置外键(menu_id)?很抱歉有困惑,但要解决这个问题会有很多帮助。如果有任何关于是否更好地在Rails中执行此操作的建议,那也将受到赞赏。

THX

1 个答案:

答案 0 :(得分:0)

Django期望如果外键不是NULL,它会映射到真实对象。你真的不能解决这个问题。但是,缺少parentNULL)的值隐含意味着没有父级,你会发现围绕此开发应用程序是非常自然的。

我看到的唯一真正问题是您是否尝试使用现有数据库(或从中迁移数据)。在这种情况下,您只需要运行SQL更新并将父级设置为NULL,只要它是0