【问题标题】:Add Custom Label to Django Model Instances将自定义标签添加到 Django 模型实例
【发布时间】:2014-12-19 17:41:46
【问题描述】:

对于一些背景知识,我在 Django webapp 中有两个主要模型。

第一个是包含产品测试特定阶段的模型:

class TestStage(models.Model):
    name = models.CharField(max_length=10)
    order = models.IntegerField()

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ['order']

从此模型创建的所有测试阶段实例都将具有与其主键相关联的集合名称。

第二个是定义产品的模型。每个产品都有自己执行的测试阶段列表,但并非所有测试插入都用于所有产品:

class Product(models.Model):
    name = models.CharField(max_length=30)

    # more fields...

    test_stages = models.TextField()

测试阶段存储为TextField 中的列表,各个数据存储为字典。目前,这运行良好,但现在我需要能够为每个测试插入添加自定义产品特定标签。

例如:

Product1 和 Product2 都有 TestStage1,但 Product1 调用它的版本 X,Product2 调用它的版本 Y。

它们都有 TestStage1,但有自己特定的命名约定。

我不确定如何实现,也不确定是使用字段标签还是使用 Meta 类来实现...

【问题讨论】:

  • 使用多线程和直通模型会简化场景,为什么要序列化字典?
  • 我不是 100% 确定。这是我最初没有编写的遗留代码。

标签: python django django-models


【解决方案1】:

您可以使用带有中间模型的 m2m 吗?

https://docs.djangoproject.com/en/1.7/topics/db/models/#extra-fields-on-many-to-many-relationships

class Product(models.Model):
    name = models.CharField(max_length=30)
    # more fields...
    test_stages = models.ManyToManyField(TestStage, through='ProductTestStage')

class ProductTestStage(models.Model):
    product = models.ForeignKey(Product)
    test_stage = models.ForeignKey(TestStage)
    label = models.CharField(max_length=50)

【讨论】:

  • 太添加了,感觉你甚至不需要使用 m2m。像这样的连接模型就足够了(换句话说,将 test_stages 字段从 Product 模型中排除,而是选择使用 TestInsertion 管理关系。使用 m2m 和 through 定义删除 .add(...) 方法来自现场,因为 Django 无法知道您在该 through 模型上拥有哪些字段(因此,我建议将 m2m 排除在外)。
  • 太好了,感谢您的更新。为了后代,我删除了之前评论的那部分。
  • 你是对的。我将类名更改为 ProductTestStage。
  • 感谢您的及时回复。我应该提到 Product 还跟踪修订并将它们存储为 HistoricalProduct 数据。该应用程序具有突出显示修订差异的视图。将每个 TestStage 与具有链接数据表的产品相关联,我需要确保主键不会更改,以便可以进行比较。 orokusaki:参考 Kaken Lid 的帖子初始帖子,您是说 test_stages 不应该是 Product 模型定义的一部分吗?
  • 你是说我应该将以下所有模型都包含在我的models.py中吗? class Product class TestStage class ProductTestStage through='TestInsertion' 做什么?
猜你喜欢
  • 2013-07-18
  • 2023-03-10
  • 2023-03-21
  • 1970-01-01
  • 2014-04-02
  • 2021-06-21
  • 2016-09-20
  • 2013-11-15
  • 1970-01-01
相关资源
最近更新 更多