免责声明:我是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'
谢谢!
答案 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
只返回一个对象。