包含特定字段值的唯一共同约束

2024-10-02 14:17:42 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我的一个模型,我需要确保某些行的unicity,但仅限于特定情况。只有“已验证”行应遵循此约束。在

基本上,我期待的是

class MyModel(models.Model):
    field_a = models.CharField()
    field_b = models.CharField()
    validated = models.BooleanField(default=False)

    class Meta:
        unique_together = (('field_a', 'field_b', 'validated=True'),)

Tags: 模型falsedefaultfieldmodelmodels情况meta
3条回答

除了前面的答案,您可以覆盖save()方法。应该是这样的:

def save(self, **kwargs):
    try:
        self.objects.get(field_a=self.field_a, field_b=self.field_b, validated=True)

        # The object already exist therefore throw an exception
        raise ValidationError(
            "field_a and field_b must be unique if validated=True"
        ) 

    except self.__class__.DoesNotExist:  # Save the model
        super(MyModel, self).save(**kwargs)  # inherit and call the save method

现在不需要调用clean()方法。在

如果使用Django 2.2,可以使用UniqueConstraint+ 这里有一个例子

class MyModel(models.Model):
    field_a = models.CharField()
    field_b = models.CharField()
    validated = models.BooleanField(default=False)

    class Meta:
        constraints = [
            UniqueConstraint(fields=['field_a', 'field_b'], condition=Q(validated=True), name='unique_field_a_field_b_validated')
        ]

这是source

(编写时,Django<;2.2)

对于Django中的unique_together,您不能这样做,大概是因为并不是所有的db后端都能够支持它。在

您可以在应用程序层使用模型验证来完成:
https://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects

例如

class MyModel(models.Model):
    field_a = models.CharField()
    field_b = models.CharField()
    validated = models.BooleanField(default=False)

    def clean(self):
        if not self.validated:
            return
        existing = self.__class__.objects.filter(field_a=self.field_a,
                                                 field_b=self.field_b).count()
        if existing > 0:
            raise ValidationError(
                "field_a and field_b must be unique if validated=True"
            )

请注意,您可能需要手动调用模型验证,即

^{pr2}$

保存模型时不会自动执行此操作。另一方面,当使用ModelForm时,它是自动完成的,即

if form.is_valid():
    instance = form.save()

相关问题 更多 >

    热门问题