我有一个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
答案 0 :(得分:0)
Django期望如果外键不是NULL
,它会映射到真实对象。你真的不能解决这个问题。但是,缺少parent
(NULL
)的值隐含意味着没有父级,你会发现围绕此开发应用程序是非常自然的。
我看到的唯一真正问题是您是否尝试使用现有数据库(或从中迁移数据)。在这种情况下,您只需要运行SQL更新并将父级设置为NULL
,只要它是0
。