唯一约束包括特定字段值

Ant*_*nto 5 python django

对于我的车型之一,我需要保证唯一性的一些行,但只能在特定情况下.只有"已验证"的行才能遵循此约束.

基本上,我期待着类似的东西

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'),)
Run Code Online (Sandbox Code Playgroud)

小智 10

如果您使用的是 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')
        ]
Run Code Online (Sandbox Code Playgroud)

这是来源


Ane*_*pic 9

你不能unique_together在Django中做到这一点,大概是因为不是所有的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"
            )
Run Code Online (Sandbox Code Playgroud)

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

instance.clean()
instance.save()
Run Code Online (Sandbox Code Playgroud)

保存模型时不会自动完成.在另一方面,它使用的ModelForm时自动完成,即

if form.is_valid():
    instance = form.save()
Run Code Online (Sandbox Code Playgroud)