Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django/Wagtail中的大型嵌套层次结构:为人父母还是分类?_Python_Django_Wagtail_Django Mptt_Django Treebeard - Fatal编程技术网

Python Django/Wagtail中的大型嵌套层次结构:为人父母还是分类?

Python Django/Wagtail中的大型嵌套层次结构:为人父母还是分类?,python,django,wagtail,django-mptt,django-treebeard,Python,Django,Wagtail,Django Mptt,Django Treebeard,我有一个数据库,其中包含50000种药物(药物)的元数据,这些药物按层次顺序排列(分类法称为ATC)。心脏药物治疗的例子如下: A --A10 ----A10X,美托洛尔 有些药物有4个水平 我需要为每种药物生成一个单独的页面。在wagtail/django中,最有效的方法是什么,包括考虑到用户希望以简单直观的方式搜索数据库 我尝试了django mptt,定义了以下模型 class-ATCChapter(MPTTModel):#主要章节 章节字母=models.CharField(最大长度

我有一个数据库,其中包含50000种药物(药物)的元数据,这些药物按层次顺序排列(分类法称为ATC)。心脏药物治疗的例子如下:

  • A
  • --A10
  • ----A10X,美托洛尔
有些药物有4个水平

我需要为每种药物生成一个单独的页面。在wagtail/django中,最有效的方法是什么,包括考虑到用户希望以简单直观的方式搜索数据库

我尝试了django mptt,定义了以下模型

class-ATCChapter(MPTTModel):#主要章节
章节字母=models.CharField(最大长度=255,null=True,blank=True)#例如“A”
章节标题=型号。CharField(最大长度=255,空值=真,空值=真)#例如“心脏药物”
parent=treeforeingkey('self',on_delete=models.CASCADE,null=True,blank=True,related_name='children')
MPTTMeta类:
顺序插入方式=['章节字母']
ATCSubchapter类(MPTTModel):#分章
分章字母=models.CharField(最大长度=255,null=True,blank=True)#例如“A10”
分章标题=models.CharField(最大长度=255,null=True,blank=True)#例如“用于心力衰竭的药物”
parent=treeforeingkey(ATCChapter,on_delete=models.CASCADE,null=True,blank=True,related_name='subchapter')
MPTTMeta类:
顺序插入方式=['分章字母']
ATCDrug类(MPTTModel,第页):#个体药物
drug_code=models.CharField(最大长度=255,null=True,blank=True)#例如“A10X”
drug_name=models.CharField(最大长度=255,null=True,blank=True)#例如“美托洛尔”
parent=TreeForeignKey(ATCSubchapter,on_delete=models.CASCADE,null=True,blank=True,related_name='disease')
MPTTMeta类:
医嘱插入方式=['drug\u code']
进行迁移会引发以下错误:
类ATCDrug(MPTTModel,Page):类型错误:元类冲突:派生类的元类必须是其所有基元类的(非严格)子类

这可以通过不让类从页面继承来解决,当然这是不好的。我删除了页面并试用了模型,但无法验证父子方案是否正确

问题:考虑到目标,我是否做了一些明显错误或次优的事情

系统:Wagtail2.10,Postgresql,计划使用Algolia进行搜索


非常感谢您的建议。

根据您的要求,每种药物都要用一页来表示,如果您确实打算在中长期使用Wagtail,我建议每种药物都是一个页面模型

这是因为您将获得所有的好处,能够向用户显示这一点,提供搜索、API和UI编辑功能,而无需任何麻烦

但是,下一个决定涉及到是将所有这些放在一个父页面模型下,还是将层次结构存储在页面模型中

如果您知道层次结构在五个深度级别上非常严格,并且每个深度都有一个特定的名称和一致的定义,那么最好将这些“级别”编码到模型中。请注意,每个药物页面的url将默认为
url.com/level-1/level2-/../insulin
,而不是
url.com/medicines/insulin

但是,也可以通过Url树中的某个固定(非嵌套)点轻松地提供每种药物。但是,如果希望规范URL是这种非嵌套的变体,您可能会发现自己在与Wagtail进行少量的斗争。这样做的好处是,您只需通过内置页面浏览器(管理菜单)进行导航,就可以在树的正确位置找到胰岛素页面

反过来说,将层次结构存储为页面模型可能还是值得的,但药物页面模型本身将是其他中心页面的子页面。这为每个药物提供了更简单的规范URL,但也意味着每个级别的页面都可以使用RoutablePageMixin访问其子代。这种方法的缺点是,管理编辑界面不会直接反映药物页面的层次结构

然而,在50000个条目中,编辑交互仍然需要一些调整和替代方法来查找页面

例如

  • 。。。水平
  • 。。。。。。A1(等)
  • 。。。药物治疗
  • 。。。。。。胰岛素
  • 联系人(其他杂项页面也将位于主页下)

这里可能没有一个“正确”的答案,您可能会发现最好设置一些页面和链接的编程创建(或类似于fixture的东西),然后两种方式都做,并在beta Wagtail实例中设置两个站点。通过这种方式,您可以看到编辑的感觉,为您的团队提供一个玩游戏的机会,并设置API。最后,无论哪种方式,您最终都需要在页面模板和模型方面非常相似的代码。

谢谢Ben!你的回答为我指明了正确的方向,因此我尝试了一些代码。我确实调整了我的问题,以进一步澄清这个问题。如果您能在模型定义上花费一分钟,我将不胜感激,因为似乎有些地方出了问题。我以前没有用过MPTT,你最好问一个关于这个问题的新问题。但是,您需要MPTT吗?Wagtail已经使用了一个不同的树结构库,称为django treebeard——检查是否可以解决您的问题,因为页面模型已经在使用它了。你好您的意思是常规的parent_page_types=[]参数就足够了吗?我确实读过你关于django中层次结构的文章,非常有用。遗憾的是,treebeard和mptt都提供了非常稀疏的文档,如果有的话,文档中的一些示例(mptt)是不完整的……嘿。如果要限制哪一页mo