验证从QuerySet排除自我

时间:2017-02-20 17:16:14

标签: python django validation model

最初我在models.py

中有这个
def validate_project_name(value,self):
    project_name = Team.objects.filter(Project_name=value)
    if self.pk:
        project_name = project_name.exclude(pk=self.pk)
    if project_name:
        raise ValidationError('This already exists.')


class Team(models.Model):
    Project_name = models.CharField(max_length=250, validators=[validate_project_name])
    Project_number = models.IntegerField()

这是因为它不允许用户输入已存在的Project_name。但是,现在我已经加入了编辑/更新功能。因此,如果用户想要更新他/她自己的Team,它将引发ValidationError,因为它存在于数据库中。因此,例如,如果用户希望保持相同Project_name但更新Project_number,则错误将会提升。所以我想从查询集中排除self。我看了一下这个例子:

django exclude self from queryset for validation

所以我只是在class Team

中添加了以下代码
def clean_name(self):
    project_name = self.cleaned_data['Project_name'].title()
    qs = Team.objects.filter(Project_name=project_name)
    if self.instance.pk is not None:
        qs = qs.exclude(pk=self.instance.pk)
    if qs.exists():
        raise ValidationError("This already exists")

但它不起作用,因为验证错误没有被提出......任何想法?

1 个答案:

答案 0 :(得分:1)

你能确定clean_name被调用吗?我的印象是模型只有clean方法,而不是每个单独字段的方法(该语法用于表单)。请尝试使用def clean(self):

https://docs.djangoproject.com/en/1.10/ref/models/instances/#django.db.models.Model.clean