Получить несколько строк одним запросом в Django? - PullRequest
19 голосов
/ 14 июня 2011

Как я могу получить QuerySet, который получает несколько строк из django?Я думал, что filter () будет работать, но, кажется, хуже.

Например, у меня есть две строки в модели Car с двумя текстовыми атрибутами (license и vin).Теперь скажите, что я хочу распечатать лицензии и vins от этих автомобилей.Как я могу сделать это с одним вызовом базы данных?

Вот ответ, который сделает два вызова базы данных:

#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

Это, очевидно, не сработало, потому что я сделал два запроса 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

Хммм, это странно, зачем делать четыре вызова базы данных?Есть ли способ, которым я могу заставить это получить два в одном вызове базы данных?

Ответы [ 2 ]

24 голосов
/ 14 июня 2011

Это кажется странным из-за того, как работает индексация в наборе запросов.

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

Если вы выполните следующее, у вас будет только один запрос:

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

As @Торстен сказал, что в вашей ситуации кажется, что вы просто пытаетесь получить все автомобилей, которые вы создали.Это может быть достигнуто с помощью метода all():

for car in Car.objects.all():
    print(car.license + car.vin)
4 голосов
/ 14 июня 2011

Отличный пример. Опечатка, я думаю, хотя в вашем последнем кодовом блоке. Должно быть:

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

Как этот метод складывается

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...