稀疏数据的Django模型

时间:2016-06-14 17:54:05

标签: django design-patterns database-design model django-crispy-forms

我正在开发一个django应用程序,其中包含许多表格,用于输入一些癌症组织样本的临床数据(每个表格10-20个字段,大多数CharFieldFloatField和一些多选文本下拉列表。)

我的挑战是我需要一个可以根据诊断显示不同字段的表单,用于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

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

  1. 创建一个包含大部分稀疏数据的巨大模型,并使用django表单处理不相关的数据。缺点:存储效率低下,并且许多开销代码与表单相关联。

  2. 为每个诊断创建一个模型。缺点:我认为这会使迁移和维护变得复杂。

  3. 为包含多个' generic'的所有诊断创建一个小模型。每种类型的字段(' CharField',' FloatField'等),并在表单/视图中动态呈现相应的字段名称。
  4. 我正在寻找关于如何实现捕获上述数据的模型/模型的任何建设性建议。效率和存储是次要问题,主要是我想要一个干净和直观的解决方案。任何为django量身定制的答案都会特别有用。

1 个答案:

答案 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 >>>)