Django 查询集执行

Geo*_*man 4 python django

在 Django 中,每次我过滤查询集或解析对象中的字段时,查询集是否都会对数据库执行新的 SQL 查询?

例如...如果我执行:

a = test.objects.all()
a2 = a.filter(name='Alex')
a3 = a.filter(name='John')
a4 = a.filter(name='Steve')
Run Code Online (Sandbox Code Playgroud)

这个序列是否向数据库发送了 4 个查询?或者它只是发送 1,然后在 Python 中处理过滤器?

出于速度目的,我正在尝试对数据库进行尽可能少的查询......并且不知道这是否实际上造成了更多的速度瓶颈?

谢谢。

Ala*_*air 8

Django 查询集是惰性的。以下行不会导致任何数据库查询。

a = test.objects.all()
a2 = a.filter(name='Alex')
a3 = a.filter(name='John')
a4 = a.filter(name='Steve')
Run Code Online (Sandbox Code Playgroud)

话虽如此,如果您导致对所有四个查询集进行评估(例如,通过使用list,那么您将执行 4 个单独的查询。

a = list(test.objects.all())
a2 = list(a.filter(name='Alex'))
a3 = list(a.filter(name='John'))
a4 = list(a.filter(name='Steve'))
Run Code Online (Sandbox Code Playgroud)

数据库非常快。对于此示例,让数据库执行所有四个查询可能没问题。您可以尝试在一个查询中获取您想要的三个名称,例如:

a_combined = a.filter(name__in=['Alex', 'John', 'Steve'])
Run Code Online (Sandbox Code Playgroud)

但这会使您的代码更加复杂。Django 不提供filter()在 Python 中进行调用的方法。

您可能会发现django-debug-toolbar有助于查看您的视图正在执行的查询。