【问题标题】:Multiple possible data types in a single Django model field?单个 Django 模型字段中有多种可能的数据类型?
【发布时间】:2023-03-09 22:46:01
【问题描述】:

TLDR

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

我的问题

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

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. 真/假(布尔字段)
  4. [字符字段]
  5. [----------------文本字段-----------------]

最后,通过将 Template 中每个 TemplateEntry 的 key 字段与 EntrySet 中每个 Entry 的 value 字段相结合来创建字典。

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

【问题讨论】:

    标签: python django model polymorphism


    【解决方案1】:

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

    如果没有,首先,如果我没有跳过某些内容,您可以同时使用 textfield 和 charfield 作为文本字段,而不是将它们分开。除此之外,最好的选择是将这些字段保留为选项null=True,blank=True。然后,根据其类型将数据添加到相关字段,并将不为空的返回给用户。而如果你需要在数据类型改变时取消之前的值,我建议你在 view 或 form 或 pre_save 信号中做。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的建议。我不得不承认我并不完全理解内容类型,但我认为让它与我的项目一起工作需要我为我存储的每种数据类型创建三个单独的模型,这与将它们存储在多个中一样复杂单个模型的字段。
      • 是的,如果你想以高水平的规范化存储数据,这是你必须付出的一部分成本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      • 2022-01-04
      • 2021-07-20
      • 1970-01-01
      • 2019-10-02
      • 2020-10-29
      • 2019-06-28
      相关资源
      最近更新 更多