首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何找到两个Django查询集的交集?

如何找到两个Django查询集的交集?
EN

Stack Overflow用户
提问于 2010-12-11 00:47:23
回答 8查看 29.4K关注 0票数 38

我有一个带有两个自定义管理器方法的Django模型。每种方法都根据对象的不同属性返回模型对象的不同子集。

class FeatureManager(models.Manager):

    def without_test_cases(self):
        return self.get_query_set().annotate(num_test_cases=models.Count('testcase_set')).filter(num_test_cases=0)

    def standardised(self):
        return self.get_query_set().annotate(standardised=Count('documentation_set__standard')).filter(standardised__gt=0)

( testcase_setdocumentation_set都是指其他型号上的ManyToManyField。)

有没有办法获得一个查询集,或者仅仅是一个对象列表,它是每个管理器方法返回的查询集的交集?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-12-11 02:39:44

重构

class FeatureManager(models.Manager):

    @staticmethod
    def _test_cases_eq_0( qs ):
       return qs.annotate( num_test_cases=models.Count('testcase_set') ).filter(num_test_cases=0)

    @staticmethod
    def _standardized_gt_0( qs ):
        return qs.annotate( standardised=Count('documentation_set__standard') ).filter(standardised__gt=0)

    def without_test_cases(self):
        return self._test_cases_eq_0( self.get_query_set() )

    def standardised(self):
        return self._standardized_gt_0( self.get_query_set() )

    def intersection( self ):
        return self._test_cases_eq_0( self._standardized_gt_0( self.get_query_set() ) )
票数 4
EN

Stack Overflow用户

发布于 2010-12-11 01:42:33

在大多数情况下,你可以直接写(利用QuerySet的"Set“部分):

intersection = Model.objects.filter(...) & Model.objects.filter(...)

这并没有很好的文档记录,但是应该与在两个查询中的条件上使用AND条件几乎完全一样。相关代码:https://github.com/django/django/blob/1.8c1/django/db/models/query.py#L203

票数 72
EN

Stack Overflow用户

发布于 2013-08-14 22:10:52

你可以这样做:

intersection = queryset1 & queryset2

要进行联合,只需将&替换为|

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4411213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档