我正在开发一个django应用程序,其中包含许多表格,用于输入一些癌症组织样本的临床数据(每个表格10-20个字段,大多数CharField
,FloatField
和一些多选文本下拉列表。)
我的挑战是我需要一个可以根据诊断显示不同字段的表单,用于150多个诊断。我可以通过编程方式读取诊断列表,每个诊断所需的字段以及相应的字段类型。此外,所有诊断中的所有唯一字段的集合都很大(远大于任何特定诊断所需的字段数)。
e.g。
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
到目前为止,我想到了以下方法:
创建一个包含大部分稀疏数据的巨大模型,并使用django表单处理不相关的数据。缺点:存储效率低下,并且许多开销代码与表单相关联。
为每个诊断创建一个模型。缺点:我认为这会使迁移和维护变得复杂。
我正在寻找关于如何实现捕获上述数据的模型/模型的任何建设性建议。效率和存储是次要问题,主要是我想要一个干净和直观的解决方案。任何为django量身定制的答案都会特别有用。
答案 0 :(得分:2)
我考虑的几个选项 -
使用Django-Polymorphic创建基于继承的模型类型
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
对继承方案中的任何模型使用单个db表,但存储类型。因此,如果您知道要捕获的特定字段是硬编码的话。另外,您可以按级别进行过滤(因此,您可以在上面的示例中对所有Animal实例或所有Iguana实例运行查询)。多态模型没有创建关系,因此性能非常好。
如果需要动态字段创建,请使用Django-Mutant
Django-Mutant允许每个模型动态创建字段,允许您根据需要快速定义数据。但是,需要使用中间表来执行此操作。您在失去效果的同时获得了很多灵活性。
使用特定于帖子的JsonField存储数据
Django 1.9引入了对字段类型JsonField的本机支持,允许您将Json结构写入db字段以及相对快速地查询它们。您可以通过良好的性能获得惊人的灵活性,但可能难以提供用户友好的表单来创建,更新和验证数据。但是,它已经在很多项目中完成,并且有一些图书馆可以帮助它。
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 >>>)