【问题标题】:How to add a new "comment" or "flag" field to every model field of existing model?如何向现有模型的每个模型字段添加新的“评论”或“标志”字段?
【发布时间】:2023-01-20 20:59:27
【问题描述】:

免责声明:我可以随时清除数据库。因此,在回答这个问题时,请不要关心迁移之类的事情。

想象一下我有一个具有多个值的模型:

class Compound(models.Model):
    color = models.CharField(max_length=20, blank=True, default="")
    brand = models.CharField(max_length=200, blank=True, default="")
    temperature = models.FloatField(null=True, blank=True)
    melting_temp = models.FloatField(null=True, blank=True)
    # more (~20) especially numeric values as model fields

现在我想添加评论待储存对于该模型的每个值.例如,我想在temperature 模型字段中添加注释“measured in winter”。

最好的方法是什么?

我的头脑风暴得出了:

  1. 手动添加 20 个模型字段,例如 temperature_comment = ... ,但这听起来不是很干
  2. 添加一个大的 json 字段来存储每条评论。但是如何创建一个带有这样一个 json 字段的表单呢?因为我想为相关值分隔每个输入字段。我可能不得不使用我想避免的 javascript。
  3. 为每个值添加一个名为Value的模型,并通过OneToOneFields将它们连接到Compound。但是我如何为Compound创建一个表单?因为我想使用一种形式创建一个Compound。我不想自己创建每个Value。此外,访问和使用 Compound 模型中的值也不像以前那么容易。

    我想对于经常出现的用例来说,这是一个相当抽象的问题。我不知道为什么我没有找到有关如何实现该目标的资源。

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    你可以做一个抽象基础模型:

    class CommentBase(models.Model):
        comment = models.CharField(
            max_length=128, blank=True, default=None, null=True
        )
        # …
    
        class Meta:
            abstract = True

    然后你可以在你的模型中混合该模型:

    class Compound(CommentBase, models.Model):
        # …
        pass
    
    
    class Other(CommentBase, models.Model):
        # ..
        pass
    
    
    # …

    它会自动将CommentBase 中定义的字段添加到继承自CommentBase 的模型中。

    【讨论】:

    • 我想这与我的 3. 方法有关,对吧?我必须创建一个抽象类,然后为我想要添加注释的每个值创建 24 个模型。然后我必须在Compound模型中总结它们,通过OneToOneField连接它们
    • @Tarquinius:不,因为这里不会创建额外的表,也不会生成关系等。
    • 好的,首先:谢谢你帮助我。但是您能否在您的答案中添加 2 个示例模型字段以使我更清楚?使用temperaturebrand。现在我没有看到你提出的名为Other 的模型的任何用例。另外 Compound 现在只有一个评论字段,但我需要对 24 个字段中的每一个进行评论!
    猜你喜欢
    • 2020-02-13
    • 2010-10-24
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2018-06-14
    相关资源
    最近更新 更多