python - 如何根据值确保 django 模型的唯一性?
问题描述
标题可能有点误导,我本质上想知道如何确保一种属性的唯一性,而不是其他属性。如果我有一个模型“MyModel”,它有一个名为“Settings”的相关模型,它为 MyModel 设置某些属性,我如何确保只有一个默认设置对象?
确保只有一个设置对象是默认设置的最佳方法是什么?我可以把“默认”和“相关模型”放在一起,但这也只允许一个非默认设置对象。我想达到我只能有一个默认设置对象的地步,但对非默认设置对象没有限制。
MyModel
attribute1 = x
...
Settings
related_model = MyModel
default = boolean
解决方案
嗯,我认为您不能在数据库级别进行设置。但是你可以在设置模型中做到这一点。假设您的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)
推荐阅读
- java - 如何在android studio中的背景图像上显示gif
- angular - 以 Angular 形式提交
- javascript - 与多个 index.html 反应
- java - 装饰器模式可以用行为模式代替来解决问题吗?
- mongodb - 无法在项目上执行目标 io.swagger:swagger-codegen-maven-plugin:2.2.3:generate (default) 代码生成失败
- ios - 通知未收到 iOS
- firebase - 添加 Firebase 存储包后 Unity android 无法构建
- asp.net-mvc - asp.net mvc 应用程序中 bin\roslyn\csc.exe 中的 exe 文件不允许在托管服务器中使用。如何解决这个问题?
- reactjs - 如何在令牌过期时创建注销
- nginx - 无法将 keyrock 与未加载的 nginx、css 和 js 文件集成