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。最后,无论哪种方式,您最终都需要在页面模板和模型方面非常相似的代码。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...