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在我的情况下效果很好。 –