我有一个带有两个自定义管理器方法的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_set
和documentation_set
都是指其他型号上的ManyToManyField
。)
有没有办法获得一个查询集,或者仅仅是一个对象列表,它是每个管理器方法返回的查询集的交集?
发布于 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() ) )
发布于 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
发布于 2013-08-14 22:10:52
你可以这样做:
intersection = queryset1 & queryset2
要进行联合,只需将&
替换为|
https://stackoverflow.com/questions/4411213
复制相似问题