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

时间:2013-02-07 21:41:45

标签: python django django-validation

我为项目组建了一个基本的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 :(得分:3)

使用exclude方法,如下所示:

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

答案 1 :(得分:1)

使用Django queryset的exclude从结果中排除当前对象。假设id模型中有Page字段作为主键:

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提交的当前对象实例所需的内容。关于最后一点的更多细节here

答案 2 :(得分:0)

我猜你可以尝试查询匹配的对象并捕获异常:

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