首页 > 解决方案 > 用 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,蓝莓)时,它不应该引发错误。yearflavorValidationErrorcooperate-optimusprimecompany-truck-juicesbb-sparkle2020blueberrycoorperate-megatroncompany-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 中的参数。

任何帮助深表感谢。提前致谢!

标签: pythondjangovalidationdjango-models

解决方案


推荐阅读