初学者:检查Queryset结果

时间:2012-03-05 22:40:23

标签: python django

免责声明:我是python和Django的新手,但拥有Drupal编程经验。

我正在按照这里的教程(http://www.djangobook.com/en/2.0/chapter05/),但我很困惑

Publisher.objects.filter(name='Apress')
[<Publisher: Apress>]

我知道结果是一个Queryset对象,所以当下面的方法失败时,如何检索地址(或主键)?

p = Publisher.objects.filter(name='Apress')
a = p.address
'QuerySet' object has no attribute 'address'

谢谢!

3 个答案:

答案 0 :(得分:3)

属性仅在模型实例上可用。 QuerySet简单地就像模型实例列表一样,所以你必须以某种方式“解包”它以获取特定实例,然后获取该属性。

如果您知道您要查询的内容中只有一个,则应使用get代替过滤器:

publisher = Publisher.objects.get(name='Apress')
print publisher.address

但是,如果返回多个匹配项,则会引发MultipleObjectsReturned异常,相反,如果未找到匹配项,则会引发ObjectDoesNotExist异常。因此,在使用get时需要小心,并确保将代码包装在适当的try...except块中。

如果你正在处理你期望有多个结果的东西,那么你可以使用某种循环结构来处理QuerySet中的每个单独的项目:

for publisher in Publisher.objects.all():
    print publisher.address

或者,像传统列表一样直接拉出一个项目:

first_publisher = Publisher.objects.all()[0]
print first_publisher.address

答案 1 :(得分:2)

也许您需要调用get函数:

p = Subject.objects.get(name='Apress')

答案 2 :(得分:1)

您的QuerySet本质上是一个列表,因此您需要遍历每个项目才能访问其address属性。像这样:

for p in Publisher.objects.filter(name='Apress'):
    # access p.address here

如果你按照上面的@Thanasis建议,你的语法会有效,因为使用get只返回一个对象。