如何找到两个Django queryset的交集?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (141)

我有一个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请参阅ManyToManyFieldS在其他型号上。)

是否有任何方法获取查询集,或者仅仅是对象列表,即每个管理器方法返回的查询集的交叉点?

提问于
用户回答回答于

重构

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() ) )
用户回答回答于

在大多数情况下,只需编写(利用QuerySet的“set”部分):

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

这并不是很好的文档,但是在这两个查询的条件下,它的行为几乎与使用和条件完全一样。

扫码关注云+社区