我需要检查表中是否存在对象。如果对象不存在,我想保存它,如果它存在,我想刷新页面并告诉用户标识符(引号)已经存在。我有这个示例代码:
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 :(得分: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
,当对象已经存在且你可以抛出所需的错误。