gpt4 book ai didi

django 从查询集中排除 self 以进行验证

转载 作者:行者123 更新时间:2023-12-04 05:37:28 24 4
gpt4 key购买 nike

我正在使用我自己的清理方法来查看其他表是否已经有一个具有相同字符串的字段。
只要我正在创建一个,这一切都很好,但是当我尝试编辑它时,它会找到“它自己”并返回错误。
现在我想知道如何在我的干净方法中排除实例本身

def clean_name(self):
raw_data = self.cleaned_data['name']
data = raw_data.title()

if Country.objects.filter(name=data).exists():
raise forms.ValidationError(("There is already a country with the name: %s") % data)
if Province.objects.filter(name=data).exists():
raise forms.ValidationError(("There is already a province with the name: %s") % data)
if Region.objects.filter(name=data).exists():
raise forms.ValidationError(("There is already a region with the name: %s") % data)
return data

我知道有一个 .exclude() ,但需要一个变量与之一起传递,不知道我怎么能用我的干净方法得到它

最佳答案

假设您的 clean_name方法在 ModelForm 上,您可以在 self.instance 访问关联的模型实例.其次,判断模型实例是新创建的还是已经存在于数据库中的一种简单方法是检查其主键的值。如果主键是 None ,模型是新创建的。

因此,您的验证逻辑可能如下所示:

def clean_name(self):
name = self.cleaned_data['name'].title()
qs = Country.objects.filter(name=name)
if self.instance.pk is not None:
qs = qs.exclude(pk=self.instance.pk)
if qs.exists():
raise forms.ValidationError("There is already a country with name: %s" % name)

为清楚起见,我只显示了一个查询集。我可能会创建一个包含所有三个查询集的元组,并遍历它们。添加 exclude 子句的代码,以及对 exists() 的调用都可以在循环内处理,因此只需要写入一次(DRY)。

关于django 从查询集中排除 self 以进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20564856/

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