需要根据找到的 Q 对象来注释 Django querySet

Posted

技术标签:

【中文标题】需要根据找到的 Q 对象来注释 Django querySet【英文标题】:Need to annotate Django querySet based on which Q object was found 【发布时间】:2011-10-24 16:00:03 【问题描述】:

所以我有几个 Q 对象的查询,这些对象被 OR-ed 在一起(以实现 UNION),我想注释每个 Q 对象匹配的结果。因此,当我去显示我的查询结果时,我可以突出显示每个结果中点击了哪些搜索词。

下面是生成查询集的代码:

Gene.objects.filter(Q(EC__EC='3.2.1.4')|Q(Protein_Family__name__in=famList)|Q(Pfam__Pfam__in=pfams),Protein_length__gte=100, Distance_From_Contig_Upstream__gte=10, Distance_From_Contig_Downstream__gte=10).distinct()

我想我可以使用 .extra 选项添加这个带注释的列: https://docs.djangoproject.com/en/1.3/ref/models/querysets/#extra

如果我不能这样做,我可能会做三个单独的查询,然后注释结果,然后将查询集 OR 在一起......我认为这可能非常浪费,而且看起来很笨拙。

【问题讨论】:

你不能 OR 查询集在一起。一旦它们被执行,它们就只是结果集的迭代器。如果您需要 OR 条件,这就是 Q 对象的用途。 @saverio 实际上,您可以:github.com/django/django/blob/master/tests/modeltests/…,但是您说得对,通常应该使用 Q 对象。 【参考方案1】:

如果您使用 extra 进行注释,则最终的 distinct 将不起作用。如果您有一条记录(在 JOINed 表中)与EC 上的条件匹配,而另一条记录与Protein.Family.name 上的条件匹配,那么它要么为您提供一条匹配记录(因此它只会添加相应的标志)或它为您提供所有匹配的记录(复制结果集中的结果)。

【讨论】:

以上是关于需要根据找到的 Q 对象来注释 Django querySet的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Q 对象在 django 模型中查询浮点/整数值或字符串?

Django 条件注释

构建后是不是可以修改 Django Q() 对象?

django q 对象条件匹配

有没有办法用非表达式注释 django 查询?

Django:为相关表构建动态 Q 查询