2012-03-05 84 views
1

声明:我是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

这些属性仅在模型实例上可用。 A 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 
+0

非常好的细节Chris。非常感谢! – 2012-03-05 23:03:10

+0

我觉得这个答案比我的更多细节更好!醇厚的黄色我认为你可以接受它!蜱! :) – 2012-03-05 23:06:50

2

也许你需要调用get函数:

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

感谢Thanasis。这工作。我害怕使用get(),因为它需要返回单个结果。 “如果没有匹配查询的结果,get()将引发DoesNotExist异常。”所以,我想objects.all()或objects.filter()会产生* list *的对象(假设有多个匹配),而get则返回单个对象。 – 2012-03-05 23:01:32

+1

你可以添加一个try块来捕获可能抛出的异常。你可以在这里找到更多的信息:http://wiki.python.org/moin/HandlingExceptions – 2012-03-05 23:04:44

1

你查询集基本上是一个列表,所以你需要循环的每个项目,以访问其address属性。事情是这样的:如果你按照上面,因为使用get回报您只有一个对象@Thanasis的意见

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

你的语法会工作。

+0

谢谢阿比德! – 2012-03-05 23:02:02