2013-01-09 80 views
0

我正试图将下面的visible函数中的两个计数查询合并为一个查询。 函数应该返回True,如果没有关系或者有关系并且某些特定的过滤是真的。仅当关系存在于一个查询中时才在ManyToManyField上过滤

class OtherModel(models.Model): 
    starts = models.DateField() 
    ends = models.DateField() 

class MyModel(models.Model): 

    m2m = models.ManyToManyField('OtherModel', blank=True,) 

    def visible(self): 
     # Should always return True if no relations to OtherModel are present. 

     if self.m2m.exists(): 
      # If relations to OtherModel are present check for starts and ends. 
      # The reason for the first check is that if there are no relations 
      # and the below query returns 0 the function will return False 
      today = datetime.date.today() 
      return self.m2m.filter(starts__lte=today, ends__gte=today).exists() 
     return True 

编辑:更多的代码和注释,替换次数与存在。

m2m关系用于日期限制,但如果没有日期限制可用,则函数应该返回True(如果没有限制,对象可见,但如果限制存在但不匹配当前日期则不可见)。

示例代码只是一个简化示例,我需要这样做并实际返回querysets。

+0

什么问题呢?任何错误? –

+0

不,我只是想避免做两个分贝查询 – sunn0

回答

2

与Q和骨料解决它,谢谢阿米尔的存在():

def visible(self): 
    today = datetime.date.today() 
    return MyModel.objects.annotate(num_m2m=Count('m2m')).filter(
      Q(pk=self.pk) & 
      (
       Q(m2m__starts__lte=today) & 
       Q(m2m__ends__gte=today) | 
       Q(num_m2m=0) 
      ) 
    ).exists() 
1

不知道什么是您的实际需求,但我想你想避免self.m2m.count() > 0额外的检查,并希望如果它存在与否,从函数返回一个布尔值,那么你需要.exists将返回True如果查询集包含任何结果,并False如果不是:

def visible(self): 
    # return True or False 
    return self.m2m.filter(some_filter=some_value).exists() 
相关问题