django中更新的模型验证

时间:2015-03-10 14:27:10

标签: 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__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

当我尝试添加已存在的术语(大写或小写)时,此验证器所做的是引发异常,并且它正常工作。我的问题是,当我尝试编辑一个现有的术语时(只是将一个字符放在大写或小写中 - 但是这个词是相同的),会引发异常,因为实际上我正在尝试添加一个已经存在的单词,本身。我想要的是验证我对所有其他术语输入的新单词,忽略了首先出现的单词以及我实际上正在改变的单词。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

您无法使用验证器,因为验证程序只能访问该值,而不能访问您尝试验证的模型实例。

您可以为模型定义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.")