QuerySet返回空列表而不是错误

时间:2015-10-10 17:48:59

标签: python django

我认为我的查询集返回一个空列表而不是"不存在错误"。我希望它返回一个错误,以便我可以返回一个替代消息。 HTML返回一个空的项目符号而不是所需的消息。

view.py

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

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

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

1 个答案:

答案 0 :(得分:1)

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

我们可以在查询集上使用.get(),如果没有对象,则会引发此异常。但是,我们无法使用它,因为查询集中可能有多个对象符合条件,并且在返回多个对象的情况下,它会引发异常。

  如果有多个对象,

get()会引发MultipleObjectsReturned   找到。

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

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