Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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
Sql Django Q&;Q与filter.filter_Sql_Django_Orm - Fatal编程技术网

Sql Django Q&;Q与filter.filter

Sql Django Q&;Q与filter.filter,sql,django,orm,Sql,Django,Orm,在查找bug时,我发现以下两条语句做了不同的事情: 查询1 Order.objects \ .filter(items__name__icontains="Foo") \ .filter(items__name__icontains="Bar") \ .distinct() 查询2 Order.objects \ .filter( Q(items__name__icontains="Foo") & Q(items__name__icontains="Ba

在查找bug时,我发现以下两条语句做了不同的事情:

查询1

Order.objects \
  .filter(items__name__icontains="Foo") \
  .filter(items__name__icontains="Bar") \
  .distinct()
查询2

Order.objects \
  .filter(
    Q(items__name__icontains="Foo") &
    Q(items__name__icontains="Bar")
  ) \
  .distinct()
结果如下:

  • 查询1不包括包含“Foo”或“Bar”项目的订单。例如,一个项目的名称为“Foo”,而另一个项目的名称为“Bar”
  • 但是,查询2仅包括至少有一个项目包含所有关键字的订单,例如名称为“Foo Bar”的项目
查看查询,我可以看到
filter()
方法向查询中添加了另一个
内部连接,而另一个没有


我可以理解这背后的原因,但我真的想知道这是否是预期的行为。

区别在于第一个查询有两个
filter()
调用,而第二个查询只有一个

第一个查询尝试查找包含“Foo”的相关项和包含“Bar”的相关项的对象。第二个查询尝试查找一个包含“Foo”和“Bar”的单个相关项的项

使用
Q()
对象的事实并不重要-您可以将第一个查询更改为:

Order.object.filter(
    Q(items__name__icontains="Foo"
).filter(
    Q(items__name__icontains="Bar")
)
但是,在第二个
查询2中需要
Q()
,因为在
.filter(items\u name\u icontains=“Foo”,items\u name\u icontains=“Bar”)中重复关键字参数是无效的


有关更多信息,请参阅上的文档。

我不知道是否有意使用,但它确实很方便。有时我想要第一种行为,有时我想要第二种行为,有办法做到这两种行为中的任何一种都是好的。@PaulTomblin绝对,如果你意识到这两者的区别的话--我在Django的“Making Queries”文档中没有找到关于它的信息,这就是为什么我想知道。--看到答案了,它就在那里。