1

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

  • 一个
  • -- 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, null=True, blank=True) # E.g "Cardiac drugs"
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')

    class MPTTMeta:
        order_insertion_by = ['chapter_letter']

class ATCSubchapter(MPTTModel): # SUBCHAPTER
    subchapter_letter = models.CharField(max_length=255, null=True, blank=True) # E.g "A10"
    subchapter_title = models.CharField(max_length=255, null=True, blank=True) # E.g "Drugs used in heart failure"
    parent = TreeForeignKey(ATCChapter, on_delete=models.CASCADE, null=True, blank=True, related_name='subchapter')

    class MPTTMeta:
        order_insertion_by = ['subchapter_letter']

class ATCDrug(MPTTModel, Page): # INDIVIDUAL DRUG
    drug_code = models.CharField(max_length=255, null=True, blank=True) # E.g "A10X"
    drug_name = models.CharField(max_length=255, null=True, blank=True) # E.g "Metoprolol"
    parent = TreeForeignKey(ATCSubchapter, on_delete=models.CASCADE, null=True, blank=True, 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 进行搜索。

感谢任何建议。

4

1 回答 1

1

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

这是因为您将获得能够向用户展示它、提供搜索、API 和 UI 编辑功能而没有任何麻烦的所有好处。

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

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

但是,也很容易通过RoutablePageMixin使每个 Medication 在 Url 树中的某个固定(非嵌套)点可用。但是,如果您希望规范 URL 成为这种非嵌套变体,您可能会发现自己与 Wagtail 进行了少量斗争。这样做的好处是,您只需通过内置页面浏览器(管理菜单)导航,即可在树的正确位置找到胰岛素页面。

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

但是,在 50,000 个条目时,编辑交互将需要一些调整和替代方法来查找页面。

例如

  • ... 水平
  • ...... A1(等)
  • ...药物
  • ...... 胰岛素
  • 联系方式(其他杂项页面也将在主页下)

这里可能没有“正确”的答案,您可能会发现最好设置一些程序化的页面创建和链接(或类似于固定装置的东西),然后双向进行并在您的 beta Wagtail 实例中设置两个站点. 通过这种方式,您可以了解编辑的感觉,让您的团队有机会参与游戏并设置 API。最后,无论哪种方式,您最终都需要在页面模板和模型方面非常相似的代码。

于 2020-10-25T03:52:00.830 回答