社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

Jessica Chambers • 5 年前 • 1530 次点击  

我有一个包含事件的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
 
1530 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Daniel Roseman
Reply   •   1 楼
Daniel Roseman    5 年前

你需要 &= |= .

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

使用 & 确保 二者都