我如何找到两个Django查询的交点? [英] How can I find the intersection of two Django querysets?

查看:113
本文介绍了我如何找到两个Django查询的交点?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个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 standard(self):
return self.get_query_set()。annotate(standards = Count('documentation_set__standard'))filter(standardised__gt = 0)

testcase_set documentation_set ManyToManyField 在其他型号。)



有没有办法获得查询,或只是一个列表对象,这是每个管理员方法返回的查询结果的交点?

解决方案

重构

  class FeatureManager(models.Manager):

@staticmethod
def _test_ca ses_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(standards = Count('documentation_set__standard')).filter(standardised__gt = 0)

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

def标准化(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()))


I’ve got a Django model with two custom manager methods. Each returns a different subset of the model’s objects, based on a different property of the object.

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)

(Both testcase_set and documentation_set refer to ManyToManyFields on other models.)

Is there any way to get a queryset, or just a list of objects, that’s the intersectiond of the querysets returned by each manager method?

解决方案

Refactor

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() ) )

这篇关于我如何找到两个Django查询的交点?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆