gpt4 book ai didi

django - django 更新时的模型验证

转载 作者:行者123 更新时间:2023-12-01 02:11:21 25 4
gpt4 key购买 nike

我创建了一个名为 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 方法,并从查询集中排除当前实例。

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.")

关于django - django 更新时的模型验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28966330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com