【问题标题】:Django: Is there a way to add a foreign key field to "unique_together"?Django:有没有办法将外键字段添加到“unique_together”?
【发布时间】:2016-06-28 16:14:02
【问题描述】:

我希望能够使模型在来自外键模型的值上唯一。不确定这在 django 中是否可行。

示例:我有一个模型 A:

class modelA(models.Model):
    fieldA1 = models.AutoField(primary_key=True)
    fieldA2 = models.CharField(max_length=20)

还有模型 B 为:

class modelB(models.Model):
    fieldB1 = models.CharField(max_length=20)
    fieldB2 = models.ForeignKey(modelA)

    class Meta:
        unique_together = ('fieldB1', 'fieldB2',<<'fieldA2'>>)

我想将 fieldA2 添加为模型 B 的 unique_together 子句中的属性之一。这在 Django 中可能吗?我不能这样做-

unique_together = ('fieldB1', 'fieldB2','modelA__fieldA2')

【问题讨论】:

    标签: python django database


    【解决方案1】:

    你不能。数据库约束不能包含那些类型的数据。在创建实例或编写一些验证器之前,您必须以编程方式对其进行检查

    【讨论】:

    【解决方案2】:

    你可以像这样覆盖modelBclean方法

    class ModelB(models.Model):
        fieldB1 = models.CharField(max_length=20)
        fieldB2 = models.ForeignKey(modelA)
    
        def clean(self):
            """
            Validate 'fieldB1', 'fieldB2' and 'fieldB2__fieldA2' are unique together
            """
            # first, check that foreign keys fields exist. Must use '_id', or else a RelatedObjectDoesNotExist error will be raised
            if self.fieldB2_id and self.fieldB2.field_A2_id:
                if self.__class__.objects.filter(fieldB1=self.fieldB1, fieldB2=self.fieldB2, fieldB2__fieldA2=self.fieldB2.fieldA2).exists():
                    raise ValidationError(
                        _('Instance of ModelB with fieldB1, fieldB2 and fieldB2.fieldA2 already exists.'),
                        code='unique_together',
                    )
    

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多