Django ORM并击中DB

ale*_*sel 8 django orm

当我做的事情

一世. objects = Model.objects.all()

然后

II. objects.filter(field_1=some_condition)

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

DTi*_*ing 13

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

阅读更多here.

编辑:

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

qs = SomeModel.objects.all()

qs1 = qs.filter(some_field='some_value')
qs2 = qs.filter(some_field='some_other_value')
Run Code Online (Sandbox Code Playgroud)

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

您可以通过将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']
Run Code Online (Sandbox Code Playgroud)

  • 怎么知道我用我的查询命中db? (4认同)