在django中使用一个查询获取多行?

use*_*618 22 django django-queryset

如何构建一个从django获取多行的QuerySet?我认为filter()可以工作,但似乎更糟糕.

例如,我在模型Car中有两行,有两个文本属性(license和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
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为我做了两个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
Run Code Online (Sandbox Code Playgroud)

嗯,这很奇怪,为什么要进行四次数据库调用?有没有办法让它在一个数据库调用中得到两个?

bra*_*ers 26

由于索引到查询集的工作原理,这似乎很奇怪.

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
Run Code Online (Sandbox Code Playgroud)

如果您执行以下操作,您也只会有一个查询:

for car in Car.objects.filter(id__in=(1,2)):
    print(car.license + car.vin)
Run Code Online (Sandbox Code Playgroud)

正如@Torsten所说,在你的情况下,你似乎只是试图获得你创造的所有汽车.这可以通过以下all()方法实现:

for car in Car.objects.all():
    print(car.license + car.vin)
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这很愚蠢。我需要做的就是在它前面放一个 list() 吗?疯狂的。谢谢!对于额外的业力:谁能解释为什么需要 list() 以及为什么它不会使查询开始? (2认同)

小智 5

很好的例子。我认为在您的最后一个代码块中有一个错字。应该:

for car in Car.objects.filter(id__in=(1,2)):
    print(car.license + car.vin)
Run Code Online (Sandbox Code Playgroud)

该方法如何叠加