Подтвердить что ты не робот

Получить несколько строк с одним запросом в django?

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

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

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

#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

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

4b9b3361

Ответ 1

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

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)

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

for car in Car.objects.all():
    print(car.license + car.vin)

Ответ 2

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

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

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