发布
社区首页 >问答首页 >QuerySet返回空列表而不是错误

QuerySet返回空列表而不是错误
EN

Stack Overflow用户
提问于 2015-10-10 17:48:59
回答 1查看 1.8K关注 0票数 1

我认为我的queryset返回的是一个空列表,而不是“不存在错误”。我希望它返回一个错误,以便我可以返回另一条消息。HTML返回的是一个空的符号点,而不是想要的消息。

view.py

代码语言:javascript
代码运行次数:0
复制
def results(request, foo_id):

    template_name = 'results.html'
    foo = Foo.objects.get(id=foo_id)
    foo_id = foo_id
    try:    
        foobars = FooBar.objects.filter(foo__foo=foo.foo)

        return render(request, template_name, {'foobars': foobars, 
            'zipcode':zipcode, 'foo_id':foo_id})

    except FooBar.DoesNotExist:
        message = 'Sorry there are no FooBar with that foo'
        return render(request, template_name, {'message':message, 
            'foo_id':foo_id})

models.py

代码语言:javascript
代码运行次数:0
复制
class Foo(models.Model):
   foo = models.IntegerField(null=True)

class FooBar(models.Model):
    foo = models.ForeignKey('Foo')
    title = models.CharField(max_length=100)
    description = models.CharField(max_length=400, null=False, blank=True )


    def __str__(self): 
        return self.title

results.html

代码语言:javascript
代码运行次数:0
复制
<html>

<h2>Title</h2>

<ul id='id_results'>
    {% for foobar in foobars%}
        <li>{{ foobar.name }}</li>
    {% empty %}
        <li> {{ message }} </li>
    {% endfor %}
</ul>

<a href= "/new_foobar/">New FooBar </a>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-10 17:53:36

如果查询集中不存在对象,则.filter() 不会引发异常,而是返回空列表。

我们本可以在查询集上使用.get(),这会在不存在对象的情况下引发此异常。但是,我们将无法使用它,因为查询集中可能有多个对象与条件匹配,如果返回多个对象,则会引发异常。

如果找到多个对象,get()将引发MultipleObjectsReturned

您可以使用foobars的布尔值进行检查,如果它是空列表,则显示消息。

代码语言:javascript
代码运行次数:0
复制
def results(request, foo_id):

    template_name = 'results.html'
    foo = Foo.objects.get(id=foo_id)
    foo_id = foo_id

    foobars = FooBar.objects.filter(foo__foo=foo.foo)
    if foobars: # check if there are any matching objects    
        return render(request, template_name, {'foobars': foobars, 
            'zipcode':zipcode, 'foo_id':foo_id})   
    else: # no matching objects
        message = 'Sorry there are no FooBar with that foo' # display the message
        return render(request, template_name, {'message':message, 
            'foo_id':foo_id})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33057114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档