2012-03-05 1 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

属性は、モデルインスタンスでのみ使用できます。 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 

または、直接引きます従来のリストと同じように1つのアイテムを表示します。

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

優秀な詳細Chris。どうもありがとうございます! –

+0

私はこの答えがより詳細で私のものより優れていると思います!私はあなたがそれを受け入れることができると思う!ダニ! :) –

2

たぶんあなたの代わりget関数を呼び出す必要があります:あなたはそのaddress属性にアクセスするために、各項目をループする必要がありますので、

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

ありがとうThanasis。それはうまくいった。私はget()を使うのは恐れていました。なぜなら、単一の結果が返される必要があるからです。 "クエリに一致する結果がない場合、get()はDoesNotExist例外を発生させます。"ですから、object.all()やobjects.filter()はオブジェクトの* list *(複数の一致があると仮定します)を返しますが、getは単一のオブジェクトを返します。 –

+1

tryブロックを追加して、スローされた可能性のある例外をキャッチすることができます。詳細はこちら:http://wiki.python.org/moin/HandlingExceptions –

1

あなたのクエリセットは、基本的にリストです。このような何か:あなたはget戻りますが、1つのオブジェクトのみを使用しているため、上記@Thanasis'アドバイスに従った場合

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

あなたの構文が働くだろう。

+0

ありがとうございました! –