python - 用 M2M 关系覆盖 validate_unique
问题描述
我正在尝试为多对多关系(m2m)实现我自己的验证,因为 django 不允许unique-together
约束中的 m2m 字段(https://code.djangoproject.com/ticket/702)(Django Unique Together(与外键))
我想要检查的是新创建的对象实例是否已经存在于 m2m 相关模型的范围内。
想象一下,我有以下 3 个模型:
class Juice(model.Model)
name=CharField,
year=IntegerField,
flavor=CharField
class Company(model.Model)
name=CharField,
cooperates=ManytoManyField
juice=ManytoManyFiedl
class Cooperate(model.Model)
name=CharField
这意味着一家公司可以拥有许多果汁,而许多果汁可以属于许多公司。同样,一个公司可以属于多个合作社,一个合作社可以属于多个公司。
我现在要实现的是以下限制:每当我创建一个新的果汁时,name
它应该验证这样的果汁是否已经存在于合作模型的范围内。这意味着如果合作社中有任何公司已经拥有这种果汁,它应该筹集. 例如,假设我创建了一种新果汁(bb-sparkle,2020,蓝莓),如果已经有一家公司(例如)拥有, ,的果汁,它应该提出验证。但是,当我为拥有公司的合作伙伴(例如)创建相同的果汁(bb-sparkle,2020,蓝莓)时,它不应该引发错误。year
flavor
ValidationError
cooperate-optimusprime
company-truck-juices
bb-sparkle
2020
blueberry
coorperate-megatron
company-airplane-juices
我要做的是在保存对象之前覆盖验证方法:
def validate_unique(self, exclude=None):
"""Overwrite validation to check for uniqueness within cooperate scope."""
juice = Juice.objects.filter(
year=self.year,
name=self.name,
flavor=self.flavor,
)
for j in juice:
for company in j.company_set.all():
for cooperate in company.cooperates.all():
if cooperate is not None:
print(cooperate)
raise ValidationError(
'Juice instances must be unique within cooperate scope.'
)
def save(self, *args, **kwargs):
"""Overwrite save to call validation before saving."""
self.validate_unique()
super(Juice, self).save(*args, **kwargs)
这不起作用,因为我只检查合作是否不是无。但我真的不知道如何正确过滤它,因为我只能访问self
-object 中的参数。
任何帮助深表感谢。提前致谢!
解决方案
推荐阅读
- html - 媒体查询无法在 Opera mini 浏览器上运行,但在 Firefox 和 chrome 浏览器上运行良好
- azure - 是否可以使用 onPremisesSyncEnabled(Microsoft Graph API)来监视 Azure AD 是否同步?
- node.js - 为什么会出现“0 - 未知错误 [object ProgressEvent]”错误?
- c# - 按组在单独的线程中运行处理
- git - 在 Git 中为多个推送提交只创建一个提交
- r - 使用循环导入许多文件
- html - HTML & HUBL:如何添加页码
- c# - c# Xamarin AutoCompleteTextView 什么都不显示
- javascript - Javascript 禁用提交按钮,除非所有 html 验证都已完成
- reactjs - 获取项目详细信息 react/redux hooks