Py学习  »  Django

Django:尝试返回两个日期之间的对象和,而不是返回所有对象的和

Jessica Chambers • 3 年前 • 775 次点击  

我有一个包含事件的Django表,每个事件都用时间戳标记。出于测试目的,我输入了一些未来的日期(2020年),但不是返回两个日期(0)之间的事件计数,而是返回自DB(5)开始以来所有事件的总和。

Django请求如下:

queryset = queryset.annotate(
    value=aggregate_operation(
        f"{MESSAGEMODEL_ATTRIBUTE_NAME_IN_DEVICEMODEL}__press_count", filter=timestamp_filter
        )
    ).values(DEVICE_REFERENCE_ATTRIBUTE_NAME, "value")

我打印了所有相关变量:

filter =  (OR: ('messages__timestamp__gte', datetime.datetime(2020, 1, 2, 16, 9, 5, tzinfo=<django.utils.timezone.FixedOffset object at 0x7fe619ed0c18>)), ('messages__timestamp__lte', datetime.datetime(2020, 8, 30, 16, 9, 5, tzinfo=<django.utils.timezone.FixedOffset object at 0x7fe619e9bf60>)))
value =  Sum(F(messages__press_count), filter=(OR: ('messages__timestamp__gte', datetime.datetime(2020, 1, 2, 16, 9, 5, tzinfo=<django.utils.timezone.FixedOffset object at 0x7fe619ed0c18>)), ('messages__timestamp__lte', datetime.datetime(2020, 8, 30, 16, 9, 5, tzinfo=<django.utils.timezone.FixedOffset object at 0x7fe619e9bf60>))))
queryset =  <QuerySet [{'name': '001 - CHANTIER1 - LIVRAISONS', 'value': 5}]>

to_timestamp from timestamp

timestamp_filter = Q()
if from_timestamp:
    timestamp_filter |= Q(
                    **{f"{MESSAGEMODEL_ATTRIBUTE_NAME_IN_DEVICEMODEL}__{TIMESTAMP_FIELD_NAME}__gte": from_timestamp}
                )
if to_timestamp:
    timestamp_filter |= Q(
                    **{f"{MESSAGEMODEL_ATTRIBUTE_NAME_IN_DEVICEMODEL}__{TIMESTAMP_FIELD_NAME}__lte": to_timestamp}
                )

为什么这个请求没有按预期执行?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/57200
 
775 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Daniel Roseman
Reply   •   1 楼
Daniel Roseman    4 年前

你需要 &= |= .

实际上,您的查询是“2020-01-02之后或2020-08-30之前的所有内容”,这与所有内容都匹配。考虑2019-01-01,它应该在范围之外;它不是在2020-01-02之后,所以它不符合第一个条件,但是 在2020-08-30之前,所以它符合第二个条件,并且整个过滤器是正确的。

使用 & 确保 二者都