web-dev-qa-db-ja.com

djangoで1つのクエリで複数の行を取得しますか?

Djangoから複数の行を取得するQuerySetを構築するにはどうすればよいですか? filter()は機能すると思いましたが、もっと悪いようです。

たとえば、モデルCarに2つの行があり、2つのテキスト属性(licenseとvin)があります。ここで、これらの車のライセンスとビンを印刷したいとします。 1回のデータベース呼び出しでそれを行うにはどうすればよいですか?

これが2つのデータベース呼び出しを行う答えです:

#using get(), two total queries
a = Car.objects.get(id=1) #query here
b = Car.objects.get(id=2) #query here
print(a.license + a.vin) #no query
print(b.license + b.vin) #no query

2つのget()クエリを作成したため、これは明らかに機能しませんでした。次に、filter()を試してみます。

#using filter(), four total queries
c = Car.objects.filter(id__in=(1,2)) #no query
print(c[0].license + c[0].vin) #two queries
print(c[1].license + c[1].vin) #two queries

うーん、それは奇妙です、なぜ4つのデータベース呼び出しを行うのですか? 1回のデータベース呼び出しで2つを取得する方法はありますか?

23
user749618

クエリセットへのインデックス作成がどのように機能するかという理由で、奇妙に思えます。

_c = list(Car.objects.filter(id__in=(1,2))) # query
print(c[0].license + c[0].vin) #no query
print(c[1].license + c[1].vin) #no query
_

次のことを行うと、クエリも1つだけになります。

_for car in Car.objects.filter(id__in=(1,2)):
    print(car.license + car.vin)
_

@Torstenが言ったように、あなたの状況では、あなたは単にあなたが作成した車を手に入れようとしているように見えますall。これは、all()メソッドを介して実現できます。

_for car in Car.objects.all():
    print(car.license + car.vin)
_
27
bradley.ayers

素晴らしい例です。あなたの最後のコードブロックにあると思いますが、タイプミスです。する必要があります:

for car in Car.objects.filter(id__in=(1,2)):
    print(car.license + car.vin)

そのメソッドはどのように積み重ねられますか

4
Streamweaver