Django - 检查对象是否存在,如果出现错误

问题描述:

我需要检查表中是否存在对象。如果对象不存在,我想保存它,如果它存在,我想刷新页面并告诉用户标识符(引号)已经存在。我有这样的例子代码: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。这意味着在网页上充满了编码信息,而不是刷新并给用户留言。

我希望能够为用户输入一个新的报价编号,而不是让开发者错误页面显示出来,让他们有一点点弹出消息。

我正在以正确的方式去解决这个问题吗?

+0

'SomeForm'是否涉及报价?理想情况下,如果它不是真的不应该有效 – Sayse

+0

@Sayse'SomeForm'是发布有关报价信息的表单。如果所有字段都输入正确,则认为它是“有效”的。如果报价编号(这是唯一标识符)已经放入表格中,我需要在信息保存之前进行检查。 – GreenSaber

+0

您可以使用消息框架来显示“显示错误”部分。 https://docs.djangoproject.com/en/1.10/ref/contrib/messages/ – Chris

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

您应该使用filter而不是get

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

我没有意识到''.exists()'只适用于查询集。我只是检查了代码,它完美地工作。谢谢你们的快速响应! – GreenSaber

我会做这样的事情:

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 %} 

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