亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Django / Wagtail 中的大型嵌套層次結構:育兒還是分類?

Django / Wagtail 中的大型嵌套層次結構:育兒還是分類?

慕的地10843 2023-12-29 10:02:22
我有一個數據庫,其中包含 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, 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進行搜索。感謝您的任何建議。
查看完整描述

1 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

根據您對每種藥物都用一個頁面表示的要求,并且如果您確實打算在中長期使用 Wagtail,我建議每種藥物都是頁面模型。

這是因為您將獲得能夠向用戶展示這一點、提供搜索、API 和 UI 編輯功能而沒有任何麻煩的所有好處。

然而,下一個決定涉及是否將所有這些都放在一個父頁面模型下,或者還將層次結構存儲在頁面模型中。

如果您知道層次結構在五個深度級別上將非常嚴格,并且每個深度都有特定的名稱和商定的定義,那么最好將這些“級別”也編碼到模型中。請注意,每個藥物頁面的 url 將默認為url.com/level-1/level2-/..../insulin而不是類似url.com/medications/insulin.

然而,通過RoutablePageMixin也可以很容易地使每種藥物在 Url 樹中的某個固定(非嵌套)點可用。然而,如果您希望規范 URL 是這種非嵌套變體,您可能會發現自己與 Wagtail 進行了少量的斗爭。這樣做的好處是,您只需通過內置的頁面瀏覽器(管理菜單)導航,就可以在樹的正確位置找到胰島素頁面。

換句話說,仍然可能值得將層次結構存儲為頁面模型,但藥物頁面模型本身將是其他某個中心頁面的子級。這為您提供了每種藥物的更簡單的規范 URL,但也意味著每個級別的頁面都可以使用 RoutablePageMixin 來授予對其后代子代的訪問權限。這種方法的缺點是管理編輯界面不會直接反映藥物頁面的層次結構。

然而,在有 50,000 個條目時,編輯交互將需要一些調整和替代方法來查找頁面。

例如

  • ... 級別

  • ...... A1(等)

  • ...藥物

  • ...... 胰島素

  • 聯系方式(其他雜項頁面也將在主頁下)

這里可能沒有“正確”的答案,您可能會發現最好設置一些頁面和鏈接的編程創建(或類似于固定裝置的東西),然后兩種方式都做,并在您的 Beta Wagtail 實例中設置兩個站點。通過這種方式,您可以了解編輯的感覺,讓您的團隊有機會參與并設置 API。最后,無論哪種方式,您最終都需要在頁面模板和模型方面非常相似的代碼。


查看完整回答
反對 回復 2023-12-29
  • 1 回答
  • 0 關注
  • 87 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號