我如何找到两个Django查询的交点? [英] How can I find the intersection of two Django querysets?
本文介绍了我如何找到两个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 ManyToManyField
s 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屋!
查看全文