【问题标题】:Django - how to save distinct values in a queryset object?Django - 如何在查询集对象中保存不同的值?
【发布时间】:2019-07-19 06:53:07
【问题描述】:

我有以下 Django 模型:提案必须是唯一的,域可以在不同的提案中具有相同的名称,但对于它所属的提案对象必须是唯一的。

class Proposal(models.Model):
   proposal_name = models.CharField(
      max_length=200,
      primary_key=True,
   )

class Category(models.Model):
   proposal_name = models.ForeignKey(
      Proposal,
      on_delete=models.CASCADE,
   )
   category_name = models.CharField(
      max_length=200,
      unique=True,
   )

目前,如果我有一个提案 -> 提案 1,那么它可能包含类别 -> 'cat A'、'cat B'。 但是如果我有另一个提案 -> 提案 2,那么我希望这个提案能够包含类似的类别名称,例如“猫 A”..

但由于在我的类别模型中,我已为类别名称提供了唯一=True 的约束,因此我无法将此类重复的类别名称存储在单独的提案中。

请指导一个相同的替代方案,可能是onetoonefield?

谢谢。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    category_name 字段中删除unique 约束,并将proposal_namecategory_name 字段一起唯一以具有组合主键。

    class Category(models.Model):
       proposal_name = models.ForeignKey(
          Proposal,
          on_delete=models.CASCADE,
       )
       category_name = models.CharField(
          max_length=200,
          unique=True,
       )
    
       class Meta:
           unique_together = ('proposal_name', 'category_name',)
    

    【讨论】:

    • 是的,'unique_together' 就是这样一个简单而优雅的解决方案。谢谢!
    【解决方案2】:

    如果您使用的是 Django 2.2,您可以使用 UniqueConstraint 而不是 unique_together,如下所示:

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['proposal_name', 'category_name'], name='give_it_some_name')
        ]
    

    作为docs 状态:

    将 UniqueConstraint 与约束选项一起使用。

    UniqueConstraint 提供了比 unique_together 更多的功能。 unique_together 将来可能会被弃用。

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 2012-11-04
      • 1970-01-01
      • 2014-02-06
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      相关资源
      最近更新 更多