我创建了一个名为 Term 的模型及其验证器,如下所示:
from django.db import models
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
def validate_insensitive_exist(value):
exists = Term.objects.filter(word__iexact = value.lower()).exists()
if exists == True:
raise ValidationError("This term already exist.")
class Term(models.Model):
word = models.CharField(max_length=200, unique=True, validators=[validate_insensitive_exist])
related_term = models.ManyToManyField("self", null=True, blank=True)
def __unicode__(self):
return self.word
def natural_key(self):
return self.word
这个验证器的作用是当我尝试添加一个已经存在的术语(小写或大写)时引发异常,并且它工作正常。我的问题是,当我尝试编辑现有术语(只是将字符设置为大写或小写 - 但单词是相同的)时,会引发异常,因为事实上我正在尝试添加一个已经存在的单词,存在本身。我想要的是根据所有其他术语验证我输入的新单词,忽略首先出现并且我实际上正在更改的单词。
有人能帮我吗?
您不能为此使用验证器,因为验证器只能访问该值,而不能访问您尝试验证的模型实例。
您可以定义一个clean https://docs.djangoproject.com/en/1.7/ref/models/instances/#django.db.models.Model.clean方法,并从查询集中排除当前实例。
class Term(models.Model):
word = models.CharField(max_length=200, unique=True)
related_term = models.ManyToManyField("self", null=True, blank=True)
def clean(self):
other_terms = Term.objects.filter(word__iexact=self.word.lower())
if self.pk:
other_terms = other_terms.exclude(pk=self.pk)
if other_terms.exists():
raise ValidationError("This term already exists.")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)