稀疏数据的 Django 模型

Django model for sparse data

我正在开发一个 Django 应用程序,其中包含许多表格,这些表格将用于输入一些癌症组织样本的临床数据(每个表格 10-20 个字段,主要是 CharFieldFloatField和一些多项选择文本下拉菜单)。

我的挑战是我需要一个可以根据诊断显示不同字段的表单,用于 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. 为每个诊断创建一个模型。缺点:我认为会使迁移和维护复杂化。

  3. 为所有诊断创建一个小模型,其中包含每种类型的多个 'generic' 字段('CharField'、'FloatField' 等),并在表单/视图中动态呈现相应的字段名称.

我正在寻找有关如何实施 model/models 捕获上述数据的任何建设性建议。效率和存储是次要问题,主要是我想要一个干净直观的解决方案。为 django 量身定制的任何答案都将特别有帮助。

我会考虑的几个选项-

使用 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 对继承方案中的任何模型使用单个数据库 table,但会存储类型。因此,如果您知道要捕获的特定字段,请对其进行硬编码。另外,您可以按级别过滤(因此,您可以 运行 查询上例中的所有 Animal 实例或所有 Iguana 实例)。多态模型没有创建任何关系,因此 performance 非常好。

如果需要创建动态字段,请使用 Django-Mutant

Django-Mutant 允许为每个模型动态创建字段,允许您根据需要动态定义数据。但是,需要中介 table 才能做到这一点。您获得了很多灵活性,同时失去了性能

使用 postgres 特定的Json字段来存储数据

Django 1.9 引入了对字段类型 JsonField 的原生支持,允许您将 Json 结构写入数据库字段 以及 相对快速地查询它们.你会得到惊人的灵活性和体面的性能,但可能难以提供用户友好的形式来创建、更新、并验证数据。然而,它已经在许多项目中完成,并且有图书馆可以协助它。

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