标题可能有点误导,我本质上是想知道如何确保一种类型的属性的唯一性,而不是其他类型的属性。如果我的模型“ MyModel”具有名为“ Settings”的相关模型,该模型为MyModel设置了某些属性,如何确保只有一个默认设置对象?
确保只有一个设置对象是默认设置的最佳方法是什么?我可以说'default'和'related_model'是unique_together,但这也只允许一个非默认设置的对象。我想说的是,我只能有一个默认设置对象,但对非默认对象没有限制。
MyModel
attribute1 = x
...
Settings
related_model = MyModel
default = boolean
答案 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)