Django ORM并击中DB

时间:2011-05-13 08:54:00

标签: django orm

当我做

之类的事情时

予。 objects = Model.objects.all()

然后

II。 objects.filter(field_1=some_condition)

每次在各种条件下进行第2步时,我都会点击db。有没有办法在第一个操作中获取所有数据,然后只是处理结果?

3 个答案:

答案 0 :(得分:12)

在评估qs之前,你实际上没有点击数据库,查询是lazy

了解更多here

编辑:

重新阅读你的问题之后,很明显你在询问如何在针对不同条件进行过滤时阻止db命中。

qs = SomeModel.objects.all()

qs1 = qs.filter(some_field='some_value')
qs2 = qs.filter(some_field='some_other_value')

通常您希望数据库为您进行过滤。

您可以通过将qs转换为列表来强制评估qs。这样可以防止进一步的db命中,但是它可能比让db返回结果更糟糕。

qs_l = list(qs)
qs1_l = [element for element in qs_l if element.some_field='some_value']
qs2_l = [element for element in qs_l if element.some_field='some_other_value']

答案 1 :(得分:2)

当然你每次都会点击db。 filter()转换为由您的数据库执行的SQL语句,如果没有命中它就不能filter。因此,您可以使用values()list(Model.objects.all())检索所需的所有对象,并且如Zeekay建议的那样,使用Python表达式(如列表推导)进行其他过滤。

答案 2 :(得分:1)

你为什么不这样做objs = Model.objects.filter(field=condition)?也就是说,一旦执行了SQL查询,您就可以使用Python表达式进行进一步的过滤/处理,而不会产生额外的数据库命中。