稀疏数据的 Django 模型
Django model for sparse data
我正在开发一个 Django 应用程序,其中包含许多表格,这些表格将用于输入一些癌症组织样本的临床数据(每个表格 10-20 个字段,主要是 CharField
、FloatField
和一些多项选择文本下拉菜单)。
我的挑战是我需要一个可以根据诊断显示不同字段的表单,用于 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
到目前为止,我想到了以下方法:
创建一个包含大部分稀疏数据的大型模型,并使用 Django 表单处理不相关的数据。缺点:低效的存储和大量与表单相关的开销代码。
为每个诊断创建一个模型。缺点:我认为会使迁移和维护复杂化。
- 为所有诊断创建一个小模型,其中包含每种类型的多个 '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 >>>)
我正在开发一个 Django 应用程序,其中包含许多表格,这些表格将用于输入一些癌症组织样本的临床数据(每个表格 10-20 个字段,主要是 CharField
、FloatField
和一些多项选择文本下拉菜单)。
我的挑战是我需要一个可以根据诊断显示不同字段的表单,用于 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
到目前为止,我想到了以下方法:
创建一个包含大部分稀疏数据的大型模型,并使用 Django 表单处理不相关的数据。缺点:低效的存储和大量与表单相关的开销代码。
为每个诊断创建一个模型。缺点:我认为会使迁移和维护复杂化。
- 为所有诊断创建一个小模型,其中包含每种类型的多个 '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 >>>)