1

我正在開發一個django應用程序,其中包含一些將用於輸入一些癌症組織樣本的臨牀數據的表單(每個表單10-20個字段,主要是CharFieldFloatField和一些多項選擇文本下拉菜單)。Django稀疏數據模型

我的挑戰是我需要一個可以顯示基於診斷的不同字段的窗體,用於150多種診斷。我可以以編程方式讀取診斷列表,每個診斷所需的字段以及相應的字段類型。此外,所有診斷中所有獨特字段的集合都很大(遠大於任何特定診斷所需字段的數量)。

例如

                    disease_specific_fields   field_type 
diagnosis 
B-lymphoblastic leukemia/lymphoma NOS              EBV-positive Pull down: Yes/No 
B-lymphoblastic leukemia/lymphoma with recurrent genetic abnormalities(TCF3-PBX1)   EBV-positive Pull down: Yes/No 
Monoclonal B lymphocytosis(CLL/SLL spectrum)             EBV-positive Pull down: Yes/No 
Peripheral T cell lymphoma NOS                EBV-positive Pull down: Yes/No 
AML with recurrent cytogenetic abnormalities(t(6;9) DEK-NUP214)        EBV-positive Pull down: Yes/No 

到目前爲止,我想到了以下方法:

  1. 創建將主要包含稀疏數據,並使用Django表單處理不相關的數據單巨大模型。缺點:存儲效率低下,大量代碼與表單綁定在一起。

  2. 爲每個診斷創建一個模型。 CONS:使遷移和維護複雜化,我認爲。

  3. 爲每種類型('CharField','FloatField'等)包含幾個'通用'字段的所有診斷創建一個小模型,並在窗體/視圖中動態顯示相應的字段名稱。

我在尋找關於如何實現捕獲上述數據的模型/模型的任何建設性建議。效率和存儲是次要問題,大多數情況下我想要一個清晰直觀的解決方案。任何爲django量身定製的答案都會特別有用。

回答

2

我會考慮─

使用Django的多態創建基於繼承的模型類型

Django-Polymorphic有幾個選項允許你使用的繼承類型的模型之間的區別。

from polymorphic.models import PolymorphicModel 

class Animal(PolymorphicModel): 
    kingdom = models.CharField(default="Animalia") 

class Lizard(Animal): 
    class = models.CharField(default="Reptilia") 

class Iguana(Lizard): 
    favorite_tree = models.Charfield() 

雖然polymorphic使用用於在繼承方案的任何模型中的單個數據庫表,類型存儲。因此,如果您知道要捕獲的特定字段,請對其進行硬編碼。另外,你可以按級別過濾(所以,你可以在上面的例子中對所有Animal實例或所有Iguana實例運行查詢)。沒有多態模型創建的關係,所以性能是非常好的。

使用Django突變是否需要動態創建領域

Django-Mutant允許動態創建每個模型的字段,允許您根據需要在飛行中頂部定義數據。但是,中間表需要這樣做。你獲得很多靈活性,同時失去性能

使用Postgres的特定JsonField來存儲數據

Django的字段類型JsonField,讓您的Json結構寫入到數據庫字段以及相對快速地對它們進行查詢1.9引入了原生支持。你會得到驚人的靈活性與體面的性能可能難以提供用戶友好形式來創建,更新和驗證數據。然而,它已經在許多項目中完成,並且有圖書館在那裏提供幫助。

from django.contrib.postgres.fields import JSONField 
from django.db import models 

class SomeModel(models.Model): 
    attributes = JsonField() 


>>> some_attributes = {'color':'red', 'cell_count':150, 'enzymes':['xyzyss','xyxzxxyx']} 
>>> a = SomeModel.objects.create(attributes=some_attributes) 
>>> SomeModel.objects.filter(attributes__color='red') 
    (<<< will return a queryset with instance 'a' in it >>>) 
+1

謝謝你一個深思熟慮的解釋。 JsonField在我的情況下效果很好。 –