Django - 检查对象是否存在,如果存在则引发错误

时间:2017-02-13 14:24:02

标签: python django

我需要检查表中是否存在对象。如果对象不存在,我想保存它,如果它存在,我想刷新页面并告诉用户标识符(引号)已经存在。我有这个示例代码:

def some_method(request):
    if request.method == 'POST':
        form = SomeForm(request.POST)
        if form.is_valid:
            quote = request.POST.get('quote')
            if SomeModel.objects.get(quote_number = quote).exists():
               refresh with error #not sure how to do
            else:
               save object #I can do this part

我遇到的问题是,当我检查对象是否存在(并且它确实存在)时,代码将引发错误,说明对象在到达if之前不存在。这意味着在网页上充满了编码信息,而不是刷新用户的消息。

我希望能够有一个小弹出消息或者某些内容供用户输入新的报价编号,而不是显示开发人员错误页面。

我是否以正确的方式解决这个问题?

3 个答案:

答案 0 :(得分:1)

问题是get返回一个对象,但exists仅适用于查询集。使用Model.DoesNotExist并且该对象不存在时,将引发get错误。

您应该使用filter代替get

qs = SomeModel.objects.filter(quote_number = quote)
if qs.exists():
    ...
else:
    ...

答案 1 :(得分:1)

我会做这样的事情:

from django.http import HttpResponseRedirect
from django.contrib import messages

...

try:
    some_object = SomeModel.objects.get(quote_number=quote)
    message.warning(request, 'some message')
    return HttpResponseRedirect('some-url')
except SomeModel.DoesNotExist:
    some_object = SomeModel.objects.create(quote_number=quote)
    ...

在模板中,您可以像这样显示消息:

{% if messages %}
    {% for message in messages %}
        {{message}}
    {% endfor %}
{% endif %}

答案 2 :(得分:0)

您可以使用get_or_create。它返回一个元组,其中包含检索(或创建)的对象和一个布尔值。如果布尔值是True,当它是一个新对象时,如果它是False,当对象已经存在且你可以抛出所需的错误。