Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django中更新的模型验证_Django_Model_Customvalidator - Fatal编程技术网

django中更新的模型验证

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

我创建了一个名为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
当我试图添加一个已经存在的术语(小写或大写)时,这个验证器所做的就是引发一个异常,它工作正常。我的问题是,当我试图编辑一个现有的术语(只是把一个字符放在大写或小写字母中,但单词是相同的)时,会出现一个异常,因为事实上我试图添加一个已经存在的单词,即它本身。我想要的是验证我输入的新词与所有其他术语的对比,忽略最初的单词和我正在实际更改的单词


有人能帮我吗

您不能为此使用验证器,因为验证器只能访问值,而不能访问您试图验证的模型实例

您可以为模型定义一个方法,并从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方法中那样。恐怕您不能在验证器中进行验证,因为您没有访问实例的权限。