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?
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)
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With