单个 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
- [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]
- [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]
- [说明] | [重点] |字段类型:[选择字符字段、文本字段、布尔字段]
- [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]
- [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]
在第二步中,将向相同或不同的用户显示基于模板的表单以及每个值的相应字段。在伪代码中:
EntrySet MODEL
foreignkey: User
foreignkey: Template
name = charfield
Entry MODEL
foreignkey: EntrySet
foreignkey: TemplateEntry
value = ??
模板 #1 的示例条目集
(条目代表什么的描述是从TemplateEntry继承过来的)
- [字符字段]
- [字符字段]
- True/False(布尔字段)
- [字符字段]
- [----------------文本字段----------------]
最后,通过将 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/
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
- [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]
- [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]
- [说明] | [重点] |字段类型:[选择字符字段、文本字段、布尔字段]
- [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]
- [说明] | [重点] |字段类型:[在字符字段、文本字段、布尔字段之间选择]
在第二步中,将向相同或不同的用户显示基于模板的表单以及每个值的相应字段。在伪代码中:
EntrySet MODEL
foreignkey: User
foreignkey: Template
name = charfield
Entry MODEL
foreignkey: EntrySet
foreignkey: TemplateEntry
value = ??
模板 #1 的示例条目集
(条目代表什么的描述是从TemplateEntry继承过来的)
- [字符字段]
- [字符字段]
- True/False(布尔字段)
- [字符字段]
- [----------------文本字段----------------]
最后,通过将 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/