【问题标题】:Get multiple rows with one query in django?在 django 中通过一个查询获取多行?
【发布时间】:2011-09-14 08:14:30
【问题描述】:

如何构建一个从 django 获取多行的 QuerySet?我认为 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

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

【问题讨论】:

    标签: django django-queryset


    【解决方案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)
    

    【讨论】:

    • 这很愚蠢。我需要做的就是在它前面放一个 list() 吗?疯狂的。谢谢!对于额外的业力:谁能解释为什么需要 list() 以及为什么它不启动查询?
    • 好吧,当你索引到一个查询集中时,它认为你只需要该查询集中的一个项目,所以它不会对整个事物执行查询,它只是对单个查询你想要的项目。但是,是的,我可以看到它看起来很奇怪:(
    • 您也可以考虑使用Car.objects.all() 而不是filter 从数据库中获取所有对象。
    • 这里唯一不清楚的是结果是否排序。我的意思是,如果我以(3,1,2) 的顺序给出id__ins,我是按照这个确切的顺序还是标准升序的ids 得到它?
    • @ErayErdin 不,不保留订单。 Django's "in" lookup 转换为 SQL “WHERE ... IN ...”子句。
    【解决方案2】:

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

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

    该方法如何叠加

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-12
      • 2012-12-27
      • 2018-04-05
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多