首页 > 解决方案 > 如何根据值确保 django 模型的唯一性?

问题描述

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

确保只有一个设置对象是默认设置的最佳方法是什么?我可以把“默认”和“相关模型”放在一起,但这也只允许一个非默认设置对象。我想达到我只能有一个默认设置对象的地步,但对非默认设置对象没有限制。

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

标签: pythondjangopython-3.xdjango-models

解决方案


嗯,我认为您不能在数据库级别进行设置。但是你可以在设置模型中做到这一点。假设您的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)

推荐阅读