单个 Django 模型字段中有多种可能的数据类型?

Multiple possible data types in a single Django model field?

TLDR

我的一个模型包含的数据可以是字符字段、文本字段或布尔字段,具体取决于在通过外键连接到的单独模型中所做的选择。在 Django 中对此建模的最有效方法是什么?

我的问题

我正在组装一个 Django 应用程序,它在一个有点冗长的两步过程中输出 python {'key': 'value'} 字典。第一步,用户设计一个包含'TemplateEntries'集合的自定义'Template'。在伪代码中:

Template MODEL  
foreign key: User  
description = textfield  
name = charfield  

TemplateEntry MODEL  
foreign key: Template  
key = charfield  
value_type = charfield(choices='CharField', 'TextField', 'BoolField')  
description = textfield  
order = positivesmallintegerfield (So users can re-arrange the order of TemplateEntries when creating the Template)  

范例表格#1

  1. [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]
  2. [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]
  3. [说明] | [重点] |字段类型:[选择字符字段、文本字段、布尔字段]
  4. [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]
  5. [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]

在第二步中,将向相同或不同的用户显示基于模板的表单以及每个值的相应字段。在伪代码中:

EntrySet MODEL  
foreignkey: User  
foreignkey: Template  
name = charfield

Entry MODEL  
foreignkey: EntrySet  
foreignkey: TemplateEntry  
value = ??

模板 #1 的示例条目集
(条目代表什么的描述是从TemplateEntry继承过来的)

  1. [字符字段]
  2. [字符字段]
  3. True/False(布尔字段)
  4. [字符字段]
  5. [----------------文本字段----------------]

最后,通过将 Template 中每个 TemplateEntry 的键字段与 EntrySet 中每个 Entry 的值字段组合来创建字典。

我遇到的问题是我不知道如何在条目模型中对 'value' 字段建模,因为它可能采用字符字段、文本字段或布尔字段的形式。我目前的方法是将其分为三个不同的字段:value_short = charfield,value_long = textfield,value_bool = boolfield 并在创建字典时遍历每个字段,只取具有内容的任何字段的值。但是,这似乎效率低下,并且如果其中不止一个包含值,则会导致错误。任何有关如何解决此问题或改进我的模型的建议都将不胜感激!

如果您的数据库支持jsonfield并且您希望将其保留为单个字段,则可以使用它。

如果没有,首先,如果我没有跳过某些内容,您可以将文本字段和字符字段都用作文本字段,而不是将它们分开。除此之外,最好的选择是将这些字段保留为选项 null=True,blank=True。然后,根据类型向相关字段添加数据,return以非空者为准。如果您需要在数据类型更改时使先前的值无效,我建议您在视图或表单中或在 pre_save 信号中进行。

感觉contenttypes对你有用,可以帮助你避免重复造轮子:

https://docs.djangoproject.com/en/3.1/ref/contrib/contenttypes/