0

我正在尝试将以下visible函数中的两个计数查询合并为一个查询。如果没有关系或存在关系并且某些特定过滤为真,则函数应返回 True。

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(如果完全没有限制,则对象可见,但如果存在限制但不匹配当前日期,则不可见)。

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

4

2 回答 2

3

用 Q 和聚合解决了它,感谢 Aamir 的存在():

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()
于 2013-01-10T08:13:04.247 回答
1

不确定您的实际要求到底是什么,但我认为您想避免self.m2m.count() > 0额外检查并希望从函数返回一个布尔值(如果它存在或不存在),那么您需要.existsTrue ,如果 QuerySet 包含任何结果,它将返回,False如果不包含任何结果:

def visible(self):
    # return True or False
    return self.m2m.filter(some_filter=some_value).exists()
于 2013-01-09T13:29:41.237 回答