问题描述
我需要检查表中是否存在对象。 如果对象不存在,我想保存它,如果对象不存在,我想刷新页面并告诉用户标识符(引用号)已经存在。 我有以下示例代码:
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
之前不存在。
这意味着网页上充满了编码信息,而不是带有针对用户的消息刷新。
我希望能够有一些弹出消息或一些东西供用户输入新的报价编号,而不是显示开发人员错误页面。
我要用正确的方法吗?
1楼
问题是, 的回报对象,但只与查询集的作品。
使用get
且对象不存在时,将引发Model.DoesNotExist
错误。
您应该使用filter
而不是get
:
qs = SomeModel.objects.filter(quote_number = quote)
if qs.exists():
...
else:
...
2楼
我会做这样的事情:
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 %}
3楼
您可以使用 。
它返回一个具有检索到(或创建的)对象和布尔值的元组。
如果布尔值是True
当它是一个新的对象,如果它是False
当对象已存在,则可以抛出所需的错误。