当我做
之类的事情时予。 objects = Model.objects.all()
然后
II。 objects.filter(field_1=some_condition)
每次在各种条件下进行第2步时,我都会点击db。有没有办法在第一个操作中获取所有数据,然后只是处理结果?
答案 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表达式进行进一步的过滤/处理,而不会产生额外的数据库命中。