使用重复参数而不是链接过滤器时,如何使用 Q 对象进行 AND 查找?

     2023-02-23     235

关键词:

【中文标题】使用重复参数而不是链接过滤器时,如何使用 Q 对象进行 AND 查找?【英文标题】:How can I do AND lookups with Q objects when using repeated arguments instead of chaining filters? 【发布时间】:2016-01-19 22:01:12 【问题描述】:

我意识到我的问题更简单,我将保留上一个问题的正文作为进一步的解释。我在使用 Q 对象进行 AND 查询时遇到问题。它是如何工作的?我提供了 4 个示例,我唯一可以让它工作的时间是在链接过滤器时,但是我想避免这种情况,以使用 OR 构建更复杂的查询。


在对同一个查询参数进行“与”运算时,我在跨与 Q 对象的关系进行查询时遇到问题。

稍微修改 Django 文档页面上的示例:“博客”模型与“作者”模型具有 m2m 关系。假设我要查询满足以下条件的所有博客:Bob 和 Mary 是作者或 Steve 是作者。我很确定这样做的唯一方法是使用 Q 对象,所以我将它分解成块。这是我迄今为止尝试过的:

Blog.objects.filter(Q(author__name='bob', author__name='mary'))

返回 SyntaxError:关键字参数重复

Blog.objects.filter(Q(author__name='bob') & Q(author__name='mary'))

返回一个空的查询集

Blog.objects.filter(author__name='bob', author__name='mary')

返回 SyntaxError:关键字参数重复

Blog.objects.filter(author__name='bob').filter(author__name='mary')

返回正确的结果,但是,现在我失去了使用 Q 对象作为 OR 参数的能力(我相信),所以我必须进行另一个查询并将结果放在 2 个查询集中,这是不希望的

我不确定我是否正确解释了我的情况,或者我是否以正确的方式进行处理。有人有什么建议吗?

【问题讨论】:

看起来像 ***.com/questions/5301996/… 的副本 试试这个 Blog.objects.filter((Q(author__name='bob') & Q(author__name='mary')) | Q(author__name='steve')) @solarissmoke 不幸的是,这个答案基本上是我的第四个例子。我正在链接过滤器,除非我运行另一个查询,否则我无法执行 OR。 @ManjunathSatyamurthy 它总是返回 OR 参数,因为左边是我的第二个例子,它总是返回空。 @spanishgeek 不确定当您说您必须进行另一个查询/将结果放在两个查询集中时是什么意思?您的第四个(链式)查询将返回 one 查询集,该查询集匹配所有以 Bob 和 Mary 作为作者的书籍。 【参考方案1】:

因此,您似乎不能使用 Q 对象来 AND 相同的参数,即使它处于 M2M 关系中。我找到了一个solution on Reddit 基本上用链式过滤器构造多个查询,然后将它们 OR 在一起,从而消除了对 Q 对象的需要:

b1 = Blog.objects.filter(authors__name='bob').filter(authors__name='mary')
b2 = Blog.objects.filter(authors__name='steve')
qs = b1 | b2

【讨论】:

【参考方案2】:

我相信这应该可行:

Blog.objects.annotate(author2=author).filter(Q(author__name='bob') & Q(author2__name='mary'))

【讨论】:

这适用于这个特定的例子,我不确定是发布我的问题的通用版本还是完整的东西。我正在尝试动态创建查询,这就是我想使用 Q 对象的原因,所以我可以附加 & 或 |取决于我需要什么。 这是通用的(使用 Q 对象)。当您在 Q 查找中两次使用相同的字段时,它假定您指的是相同的元素。否则,将无法执行以下操作:Blog.objects.filter(Q(author__firstname='bob') & Q(author__lastname='smith')) 如果它按您的意愿工作,它将匹配某个作者的名字为 bob 而另一个作者的姓氏为 smith 的任何博客,这可能不是您想要的. 这就是我的想法,这更多的是我的理解问题,而不是 Q 对象的实际限制。幸运的是,我能够找到适合我需要的东西!

Django/Python DRY:使用 Q 对象和模型属性时如何避免重复代码

】Django/PythonDRY:使用Q对象和模型属性时如何避免重复代码【英文标题】:Django/PythonDRY:howtoavoidrepeatcodewhenworkingwithQobjectsandmodelattributes【发布时间】:2013-06-1721:29:19【问题描述】:我正在尝试构建一个搜索页面,该页面将允许用... 查看详情

如何在 django 查询中使用列表 [重复]

】如何在django查询中使用列表[重复]【英文标题】:Howtousealistindjangoquery[duplicate]【发布时间】:2020-03-0620:25:54【问题描述】:我有一个owner_id列表,我想在django查询中使用该列表,但它给了我以下错误:TypeError:int()参数必须是字... 查看详情

正确使用地图对象而不是参数

】正确使用地图对象而不是参数【英文标题】:Usemapobjectinsteadofparamscorrectly【发布时间】:2022-01-2115:50:24【问题描述】:我想使用地图对象而不是调用checkOrder3次。在这种情况下如何通过Map而不是所有参数使用?:Admin.tsclassAdmina... 查看详情

当输入不是过滤器对象的一部分时如何使用feComposite?

】当输入不是过滤器对象的一部分时如何使用feComposite?【英文标题】:HowtousefeCompositewhenaninputisnotapartoftheobjectofthefilter?【发布时间】:2021-11-0810:25:02【问题描述】:<svg><style>#anistroke-dasharray:var(--len);stroke-dashoffset:var(--le... 查看详情

如何允许用户过滤数据库中的对象,允许参数的多个选择[重复]

...数选择一个值但我想允许多个选择时,这很有效。我试过使用 查看详情

使用FFmpeg concat过滤器而不是协议,不同的结果[重复]

】使用FFmpegconcat过滤器而不是协议,不同的结果[重复]【英文标题】:UsingFFmpegconcatfilterinsteadofprotocol,differrentresults[duplicate]【发布时间】:2016-02-1920:46:21【问题描述】:我有两个文件需要合并。我可以使用ffmpegconcat协议来做到这... 查看详情

我如何将 count() 与 Q 对象一起使用?

...讨论】:你想达到什么目的?【参考方案1】:鉴于使用过滤器将产生一个查询集对象,您应该能够在所述包含过滤器的末尾使用count()。喜欢:coun 查看详情

使用 dstore Rest 在查询参数中禁用过滤器

】使用dstoreRest在查询参数中禁用过滤器【英文标题】:DisablefilterinqueryparameterusingdstoreRest【发布时间】:2015-09-1312:20:42【问题描述】:因为我使用的dgrid对象比与store交互的本机dojo对象多,所以我想切换到dstore而不是dojo.store.rest... 查看详情

使用显示时如何使文本从换行符开始而不是超过 div:flex [重复]

】使用显示时如何使文本从换行符开始而不是超过div:flex[重复]【英文标题】:Howtomaketextstartonnewlineinsteadofexceedingdivwhenusingdisplay:flex[duplicate]【发布时间】:2021-12-3114:03:58【问题描述】:标题差不多。如果div中的文本大于div的宽... 查看详情

如何在运行时解析 dll 中的外部符号,而不是使用 Cygwin 进行链接时

】如何在运行时解析dll中的外部符号,而不是使用Cygwin进行链接时【英文标题】:Howtoresolveexternalsymbolsindllatruntime,insteadoflinktimewithCygwin【发布时间】:2020-04-2816:36:22【问题描述】:我正在将一组程序从linux移植到Windows+Cygwin。集... 查看详情

如何在悬停而不是点击事件时打开 BeRocket 过滤器,WordPress?

】如何在悬停而不是点击事件时打开BeRocket过滤器,WordPress?【英文标题】:HowtoopenBeRocketFiltersonhoverinsteadofclickevent,WordPress?【发布时间】:2021-12-0721:47:50【问题描述】:我下载了BeRocketAJAX过滤器插件,我需要一些jquery自定义。目... 查看详情

如何使用 qRegisterMetaType 而不是 Q_ENUM?

】如何使用qRegisterMetaType而不是Q_ENUM?【英文标题】:HowtouseqRegisterMetaTypeinsteadofQ_ENUM?【发布时间】:2019-07-0103:04:23【问题描述】:这是我的包含Q_ENUM的类。由于我使用QVariant,我需要使用Q_ENUM。原因在我的应用程序中,有一个部... 查看详情

应用 IF 而不是 MATCH 时如何使用 INDEX?

】应用IF而不是MATCH时如何使用INDEX?【英文标题】:HowtouseINDEXwhenapplyinganIFandnotaMATCH?【发布时间】:2015-03-2718:08:21【问题描述】:我在LibreOfficeCalc中有两个数据集,其中包含平面中对象的笛卡尔坐标。一种是旧数据有X个对象,... 查看详情

使用一个属性而不是整个对象来区分[重复]

】使用一个属性而不是整个对象来区分[重复]【英文标题】:Distinctusingonepropertyandnotentireobject[duplicate]【发布时间】:2015-02-1101:39:36【问题描述】:我正在使用C#/EntityFramework并尝试将Distinct()与一个属性一起使用,但我找不到正确... 查看详情

如何在 CrudRepository 上使用 findAll() 返回 List 而不是 Iterable [重复]

】如何在CrudRepository上使用findAll()返回List而不是Iterable[重复]【英文标题】:HowtousefindAll()onCrudRepositoryreturningaListinsteadofIterable[duplicate]【发布时间】:2019-10-2306:29:49【问题描述】:我想编写一个FindAll()方法,它返回一个包含所有St... 查看详情

当我使用“或”条件时,为啥我的查询使用过滤而不是索引条件?

】当我使用“或”条件时,为啥我的查询使用过滤而不是索引条件?【英文标题】:WhyismyqueryusesfilteringinsteadofindexcondwhenIusean`OR`condition?当我使用“或”条件时,为什么我的查询使用过滤而不是索引条件?【发布时间】:2021-11-121... 查看详情

使用登录过滤器而不是控制器时处理 OPTIONS 和 CORS

】使用登录过滤器而不是控制器时处理OPTIONS和CORS【英文标题】:HandlingOPTIONSandCORSwhenusingasigninfilterinsteadofcontroller【发布时间】:2017-09-2716:50:57【问题描述】:我有一个AbstractAuthenticationProcessingFilter,用于处理路径/sign-in上的POST... 查看详情

如何使用卡片而不是角度 8 中的数据表过滤数据?

】如何使用卡片而不是角度8中的数据表过滤数据?【英文标题】:HowcanIfilterdatausingcardsandnotdatatablesinangular8?【发布时间】:2020-02-2615:29:48【问题描述】:我正在尝试使用卡片过滤数据,但我没有设法使用卡片而不是数据表过滤... 查看详情