Django:检查对象是否存在但不是当前实例

1 投票
3 回答
2559 浏览
提问于 2025-04-17 15:10

我为一个项目搭建了一个基本的内容管理系统(CMS),现在我在添加一个订单系统,这样你就可以在导航栏中对创建的页面进行排序。不过,我写的自定义验证器有点过于严格,当你编辑一个页面时,它会报错,因为数据库中已经有相同的排序了。

这个表单是基于以下模型的:

class Page(models.Model):
page_name = models.CharField(max_length=100)
page_content = models.CharField(max_length=16777000)
link = models.URLField(blank=True)
order = models.IntegerField()

自定义验证器:

def clean_order(self):
    data = self.cleaned_data['order']
    pg = Page.objects.filter(order=data)
    if pg.count() > 0:
        raise forms.ValidationError("This order number already exists. Use another.")
    return data

有没有办法让我在更新的时候,只有在新的排序已经存在且不是当前页面的情况下,才触发错误?就像这样:

pg = Page.objects.filter(order=data).filter(pk!=editpagepk)

谢谢!

3 个回答

0

我想你可以试着去查询那个匹配的对象,然后捕捉到可能出现的错误:

try:
    Page.objects.filter(order=data).get(pk=editpagepk)
except Page.DoesNotExist:
    raise forms.ValidationError("...")
1

使用Django的查询集中的 exclude 方法,可以把当前对象从结果中排除掉。假设你的 Page 模型里有一个 id 字段,它是主键:

def clean_order(self):
    order = self.cleaned_data['order']
    pg = Page.objects.filter(order=order).exclude(id=self.instance.id)
    if pg.count() > 0:
        raise forms.ValidationError(" ... ")
    return data

上面的内容假设你在使用ModelForm,因为你需要通过 self.instance 来找到当前通过POST提交的对象实例。关于这一点的更多细节可以在 这里 找到。

3

使用 exclude 方法,像这样:

pg = Page.objects.filter(order=data).exclude(pk=self.instance.pk)

撰写回答