2016-11-22 55 views
0

我正在通过编码为企业家做一些Django实践。 这是代码:Django Query的问题

from django.shortcuts import render, get_object_or_404 
from django.http import HttpResponse 
from django.views import View 

from .models import KirrURL 

def kirr_redirect_view(request,shortcode=None,*args,**kwargs): 

    #Method 1: 

    obj = get_object_or_404(KirrURL, shortcode__iexact=shortcode) 
    obj_url = obj.url 

    #Method 2: 

    qs = KirrURL.objects.filter(shortcode__iexact=shortcode) 
    if qs.exists() and qs.count() == 1: 
     obj = qs.first() 
     obj_url = obj.url 

    return HttpResponse("Hello : {sr}".format(sr=obj_url)) 

我做什么是我得到一些话,从URL,并将其传递到kirr_redirect_view,并USDE查询来获取数据并返回一些单词。 该网站介绍了两种方法来做到这一点。第二个工作正常。当我更改为第一种方法。该方法突然出现错误,即使我传递了正确的关键词,我仍然从页面获取404。

+5

如果选项2是您正在使用的网站推荐的,则需要立即找到其他教程。这完全没有理由的三个查询。 –

回答

2

按照Django的文档:

get_object_or_404()

调用的get()在一个给定的模型管理器,但它提出了HTTP404而不是模型的DoesNotExist例外。

因此,如果没有匹配的记录,get_object_or_404将提高404: content not found

在第二种方法中,如果没有匹配,即您的if失败,仍然会发送HttResposne对象,该对象的默认状态为200: OK

总之,您的KireURL模型没有匹配的记录shortcode__iexact=shortcode

+0

我的意思是,当我输入相同的shortcode参数,这是建立在我的数据库中,第一个方法失败,第二个很好。我不知道为什么。我认为它应该得到相同的结果。或者我应该给一些额外的代码供您检查? – honesty1997

0

第二种方法显示你的网址或只是没有提出错误?过滤器永远不会引发任何异常,以及它看起来像多于一个具有相同短代码的对象,或者没有任何异常并且如果condition.That是为什么get_object_or_404()引发异常。

+0

我现在再次在shell中运行它,当get_object_or_404保持失败时,我可以使用get方法得到确切的结果...... – honesty1997

0

我在这里添加一些信息。这是我使用Python shell运行代码时得到的结果。

>>> from shortener.models import KirrURL 
>>> from django.shortcuts import get_object_or_404 
>>> obj = get_object_or_404(KirrURL,shortcode='pric3e') 

Traceback (most recent call last):File"/Users/phil/Desktop/django110/lib/python3.5/site 
packages/django/shortcuts.py", line 85, in get_object_or_404 
return queryset.get(*args, **kwargs) 
File "/Users/phil/Desktop/django110/lib/python3.5/site-packages/django/db/models/query.py", line 385, in get 
self.model._meta.object_name 
shortener.models.DoesNotExist: KirrURL matching query does not exist. 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
File "<console>", line 1, in <module> 
File "/Users/phil/Desktop/django110/lib/python3.5/site-packages/django/shortcuts.py", line 93, in get_object_or_404 
raise Http404('No %s matches the given query.' % queryset.model._meta.object_name) 
django.http.response.Http404: No KirrURL matches the given query. 

>>> obj = KirrURL.objects.get(shortcode='pric3e') 
>>> obj 
<KirrURL: http://google.com> 
>>> obj.id 
1 
>>> obj.url 
'http://google.com'