django中更新的模型验证
我创建了一个名为Term的模型,并为其创建了一个验证器,如下所示:django中更新的模型验证,django,model,customvalidator,Django,Model,Customvalidator,我创建了一个名为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__iexa
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
当我试图添加一个已经存在的术语(小写或大写)时,这个验证器所做的就是引发一个异常,它工作正常。我的问题是,当我试图编辑一个现有的术语(只是把一个字符放在大写或小写字母中,但单词是相同的)时,会出现一个异常,因为事实上我试图添加一个已经存在的单词,即它本身。我想要的是验证我输入的新词与所有其他术语的对比,忽略最初的单词和我正在实际更改的单词
有人能帮我吗 您不能为此使用验证器,因为验证器只能访问值,而不能访问您试图验证的模型实例 您可以为模型定义一个方法,并从queryset中排除当前实例
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.")
可能的重复不是真正的重复-这个问题已经使用了
clean
方法。要回答这个问题,您首先必须解释为什么验证器不能工作。确切地说是阿拉斯代尔。我想在验证器中进行验证,而不是像在clean方法中那样。恐怕您不能在验证器中进行验证,因为您没有访问实例的权限。