需要根据找到的 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的主要内容,如果未能解决你的问题,请参考以下文章