如何根据值确定Django模型的唯一性?

时间:2019-01-21 11:18:04

标签: python django python-3.x django-models

标题可能有点误导,我本质上是想知道如何确保一种类型的属性的唯一性,而不是其他类型的属性。如果我的模型“ MyModel”具有名为“ Settings”的相关模型,该模型为MyModel设置了某些属性,如何确保只有一个默认设置对象?

确保只有一个设置对象是默认设置的最佳方法是什么?我可以说'default'和'related_model'是unique_together,但这也只允许一个非默认设置的对象。我想说的是,我只能有一个默认设置对象,但对非默认对象没有限制。

MyModel
attribute1 = x
...
Settings
related_model = MyModel
default = boolean

1 个答案:

答案 0 :(得分:0)

嗯,我认为您不能在数据库级别进行设置。但是您可以在“设置模型”中执行此操作。假设您的MyModel模型在Settings模型中具有关系。像这样:

class Settings(models.Model):
    mymodel = models.ForeignKey(Settings, on_delete=models.DO_NOTHING, related_name="attributes")
    default = models.BooleanField(default=False)

然后在您的Settings模型中,可以在save方法中添加如下约束:

from django.core.exceptions import ValidationError


class Settings(...):
    def save(self, *args, **kwargs):
        query = self.mymodel.attributes.all()
        if self.pk:
            query = query.exclude(pk=self.pk)

        if self.default == True:
           if query.filter(default=True).exists():
               raise ValidationError("Already a default value exists")
        return super(Attribute, self).save(*args, **kwargs)