Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
链式QuerySet过滤器是否等同于使用Django ORM在单个过滤器中定义多个字段?_Django_Django Models_Filtering - Fatal编程技术网

链式QuerySet过滤器是否等同于使用Django ORM在单个过滤器中定义多个字段?

链式QuerySet过滤器是否等同于使用Django ORM在单个过滤器中定义多个字段?,django,django-models,filtering,Django,Django Models,Filtering,在过滤查询集时,我想知道下面这些是否等效 User.objects.filter(username='josh').filter(email__startswith='josh') User.objects.filter(username='josh', email__startswith='josh') 我无法想象生成的SQL在两者之间会有什么不同。文档中似乎也没有提到任何差异。您可以在shell中执行这些查询并打印生成的SQL,如: >>> print User.obje

在过滤查询集时,我想知道下面这些是否等效

User.objects.filter(username='josh').filter(email__startswith='josh')
User.objects.filter(username='josh', email__startswith='josh')

我无法想象生成的SQL在两者之间会有什么不同。文档中似乎也没有提到任何差异。

您可以在shell中执行这些查询并打印生成的SQL,如:

>>> print User.objects.filter(username='josh').filter(email__startswith='josh').query
我测试了一个类似的查询,就像你在这里得到的一样,在生成的SQL代码中没有区别。这两个语句最终都使用相同的WHERE语句

此外,在这种情况下,你是将过滤器串联起来还是一步一步地应用它们也不会有任何区别

但在某些情况下,过滤顺序很重要。
看一看。

Django QuerySet是惰性的,正在运行:

User.objects.filter(username='josh').filter(email__startswith='josh')
甚至

a = User.objects.filter(username='josh')
a = a.filter(email__startswith='josh')

仅生成一个db查询,该查询在您尝试访问数据时执行。这样的查询将在where子句中对所有筛选器和排除进行协商

但是你得到了不同的结果?目前,我没有任何例子可以给出不同的结果。但我似乎记得在某一点上存在差异,最近我还记得我想找出是否存在差异。我问的是一般意义上的问题,没有具体的例子。绝对没有区别。我知道他们很懒。我试图讨论使用多个
过滤器
或单个
过滤器
与多个KWARG之间的区别(如果存在)。没有区别,只是确认了,尽管我认为不应该。也可以通过django.db.connection.querys检查实际的SQL,但是
.query()
总是比较容易。@okm,我用.query检查了一些简单的查询,没有区别。但正如金戈所指出的,显然,你对跨越的关系应用过滤的顺序会产生影响。文档有点混乱。@JoshSmeaton是的,您可以更新关于混乱部分的问题。对于跨距查找,每个筛选/排除附加单独的联接,然后生成的查询受实际排序和查找字段的约束。@okm,但这是由于排序造成的效果,还是与链式筛选相比,在单个
筛选中使用多个KWARG?@JoshSmeaton我认为主要是后一种带跨距查找。排序可能会更改生成的SQL中的WHERE条件,但不一定会更改结果;在分离的过滤器中,跨越式查找总是引入额外的连接,从而改变结果。