python 如何在现有模型的每个模型字段中添加一个新的“注解”或“标志”字段?

xzabzqsa  于 2023-01-11  发布在  Python
关注(0)|答案(1)|浏览(104)

免责声明:我可以随时清除数据库。所以在回答这个问题的时候,请不要关心迁移之类的事情。
假设我有一个具有多个值的模型:

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”。
做这件事的最佳方法是什么?
我的头脑 Storm 想出了:
1.手动添加20个模型字段,如temperature_comment = ...,但听起来不是很干
1.添加一个大的json字段来存储每个评论。但是我如何创建一个有这样一个json字段的表单呢?因为我想把每个输入字段的相关值分开。我可能不得不使用javascript,这是我想避免的。
1.为每个值添加一个名为Value的模型,并通过OneToOneField连接到Compound。但是如何为Compound创建一个Form呢?因为我想使用一个Form创建一个Compound。我不想单独创建每个Value。而且它也不像以前那么容易。来访问和使用Compound模型中的值。
我想对于一个经常出现的用例来说,这是一个相当抽象的问题。我不知道为什么我没有找到关于如何完成这个问题的资源。

rsaldnfx

rsaldnfx1#

您可以创建一个 * 抽象基础模型 *:

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继承的模型中。

相关问题