最初我在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")
但它不起作用,因为验证错误没有被提出......任何想法?
答案 0 :(得分:1)
你能确定clean_name
被调用吗?我的印象是模型只有clean
方法,而不是每个单独字段的方法(该语法用于表单)。请尝试使用def clean(self):
https://docs.djangoproject.com/en/1.10/ref/models/instances/#django.db.models.Model.clean