如何解决Django / Wagtail中的大型嵌套层次结构:育儿还是分类?
我有一个数据库,其中包含有关50,000种药物(药物)的元数据,这些元数据是按等级排序的(分类法称为ATC)。以下是心脏药物的示例:
- A
- -A10
- ---- A10X,美托洛尔
有些药物有4种水平。
我需要为每种药物生成一个单独的页面。在wagtail / django中这样做最有效的方法是什么,包括考虑到用户希望使用一种简单直观的方法来搜索数据库。
我尝试了 django-mptt ,定义了以下模型。
class ATCChapter(MPTTModel): # MAIN CHAPTER
chapter_letter = models.CharField(max_length=255,null=True,blank=True) # E.g "A"
chapter_title = models.CharField(max_length=255,blank=True) # E.g "Cardiac drugs"
parent = TreeForeignKey('self',on_delete=models.CASCADE,blank=True,related_name='children')
class MPTTMeta:
order_insertion_by = ['chapter_letter']
class ATCSubchapter(MPTTModel): # SUBCHAPTER
subchapter_letter = models.CharField(max_length=255,blank=True) # E.g "A10"
subchapter_title = models.CharField(max_length=255,blank=True) # E.g "Drugs used in heart failure"
parent = TreeForeignKey(ATCChapter,related_name='subchapter')
class MPTTMeta:
order_insertion_by = ['subchapter_letter']
class ATCDrug(MPTTModel,Page): # INDIVIDUAL DRUG
drug_code = models.CharField(max_length=255,blank=True) # E.g "A10X"
drug_name = models.CharField(max_length=255,blank=True) # E.g "Metoprolol"
parent = TreeForeignKey(ATCSubchapter,related_name='disease')
class MPTTMeta:
order_insertion_by = ['drug_code']
进行迁移会引发以下错误:class ATCDrug(MPTTModel,Page): TypeError: Metaclass conflict: the Metaclass of a derived class must be a (non-strict) subclass of the Metaclasses of all its bases
这可以通过不让类从Page继承来解决,这当然是不好的。我删除了Page并尝试了模型,但无法验证父子方案是否正确。
问题:在达到目标的情况下,我是在做明显明显错误或次优的事情吗?
系统:Wagtail 2.10,Postgresql,计划使用Algolia进行搜索。
感谢任何建议。
解决方法
根据您的要求,每种药物都应以单个页面表示,并且如果您打算在中长期内使用Wa,则建议每种药物都为Page模型。
这是因为您将获得向用户展示此功能,提供搜索,API和UI编辑功能而没有任何麻烦的所有好处。
但是,下一个决定与是否将所有这些放置在一个父页面模型下还是将层次结构存储在页面模型中有关。
如果您知道层次结构在五个深度级别上将相当严格,并且每个深度都有一个特定的名称和一致的定义,那么最好也将这些“级别”编码到模型中。请注意,尽管每个药物页面的网址都将默认为url.com/level-1/level2-/..../insulin
,而不是url.com/medications/insulin
之类的内容。
但是,很容易通过RoutablePageMixin在Url树的某个固定(非嵌套)点上提供每种药物。但是,如果您希望规范URL成为此非嵌套变体,则可能会与Wagtail进行少量对抗。这样做的好处是,只需通过内置的页面浏览器(管理菜单)进行导航,您就可以在树的正确位置找到“胰岛素”页面。
相反,仍然有必要将层次结构存储为Page模型,但是药物Page模型本身将是其他某个中央页面的子级。这为您提供了每种药物的更简单的规范URL,也意味着每个级别的Page都可以使用RoutablePageMixin来访问其后代孩子。这种方法的缺点是,管理员编辑界面不会直接反映有关用药页面的层次结构。
但是,在50,000个条目的情况下,编辑交互将需要一些调整和其他方式来找到页面。
例如
- 家
- ...水平
- ...... A1(等)
- ...药物
- ......胰岛素
- 联系方式(其他杂项页面也位于首页下)
这里可能没有一个“正确”的答案,您可能会发现最好以编程方式创建页面和链接(或类似固定装置的内容),并且同时进行两种操作并在您的网站中设置两个站点beta g实例。通过这种方式,您可以查看编辑的感觉,让您的团队有机会参与其中并设置API。最后,无论哪种方式,您最终都需要在页面模板和模型方面非常相似的代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。