问题描述
|
我有一个PHP应用程序,正在考虑用Django或Rails重写(这些年来已经做了一些维护工作,但对这样的问题并不熟悉)。理想情况下,我希望数据库架构尽可能接近我正在使用的数据库。它具有如下模型:
菜单-ID,名称
menu_headers-id,menu_id,parent_menu_header_id,排序,名称
getMenu($ id)函数中的逻辑是按id获取菜单,然后获取具有正确menu_id和parent_menu_header_id为0的menu_headers。有一个子菜单函数被调用,该函数基于parent_menu_header_id获取子菜单。换句话说,0表示它是根menu_header(即从menu_headers中选择*,其中menu_id = $ menu_id和parent_menu_header_id = 0排序)。所有这些都被推送到内存缓存,因此性能不是问题。
我正在考虑将应用程序移至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,但是认为这应该可行。有任何想法吗?
谢谢
-编辑#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中更好地执行此操作的建议,也将不胜感激。
谢谢
解决方法
Django期望,如果外键不是
NULL
,它将映射到真实对象。您真的无法解决这个问题。但是,缺少parent
(NULL
)的值暗含表示没有父级,并且您会发现围绕此开发应用程序是很自然的。
我看到的唯一真正的问题是,您是否正在尝试使用现有数据库(或从中迁移数据)。在这种情况下,您只需运行SQL更新并将父级设置为NULL
(无论它是0
)即可。