Get multiple rows with one query in django?

自古美人都是妖i 提交于 2020-01-11 17:58:41

问题


How can I get build a QuerySet that gets multiple rows from django? I thought filter() would work, but it seems to be worse off.

For example, I have two rows in the model Car, with two text attributes (license and vin). Now say I want to print the licenses and vins from these cars. How can I do that with one database call?

Here's an answer that will make two database calls:

#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

That obviously didn't work because I made two get() queries. So next I'll try 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

Hmmm, that's weird, why is making four database calls? Is there a way I can make it get the two in one database call?


回答1:


It's seems weird because of how indexing into a queryset works.

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

If you do the following, you'll only have one query too:

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

As @Torsten said, in your situation it appears like you're simply trying to get all the cars you've created. This can be achieved via the all() method:

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



回答2:


Great example. A typo I think though in your last codeblock. Should be:

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

How does that method stack up



来源:https://stackoverflow.com/questions/6337973/get-multiple-rows-with-one-query-in-django

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!