You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django ORM查询问题:获取近24小时关联计数>3的Testmodel1对象失败

解决Django查询返回空QuerySet的问题

首先,你的查询返回空结果主要有两个核心问题,我来逐一分析并给出修复方案:

1. 时间过滤的精度问题

你用了arrow.utcnow().shift(hours=-24).date(),这会把时间截断到日期级别(比如当前时间是2024-05-20 15:30,转换后变成2024-05-19),导致查询的是entry_time >= 2024-05-19 00:00:00,而不是精确的近24小时(即从2024-05-19 15:30到现在)。这可能会过滤掉部分符合条件的记录,或者引入不符合时间范围的记录。

2. 计数逻辑的方向性错误

你的Testmodel1中contact是ForeignKey,意味着每个Testmodel1实例只能关联一个Testmodel2实例。所以annotate(t_count=Count('contact'))统计的是当前Testmodel1对象的contact字段的数量,结果永远是1,自然无法满足filter(t_count__gt=3)的条件,这是空QuerySet的主要原因。

你的需求应该是:找到近24小时创建、stage=1,并且该Testmodel1关联的Testmodel2对象被至少3个符合条件的Testmodel1关联的那些Testmodel1实例。


修复后的查询代码

这里提供两种可行的方案:

方案一:先筛选符合条件的Contact,再关联查询Testmodel1

from django.db.models import Count
import arrow

# 精确获取24小时前的完整datetime,保留时分秒
last_24h = arrow.utcnow().shift(hours=-24).datetime

# 第一步:找出被至少3个符合条件的Testmodel1关联的Testmodel2
valid_contacts = Testmodel2.objects.filter(
    testmodel1__entry_time__gte=last_24h,
    testmodel1__stage=1
).annotate(
    tm1_count=Count('testmodel1')
).filter(
    tm1_count__gt=3
)

# 第二步:查询属于这些contact的、符合条件的Testmodel1
result = Testmodel1.objects.filter(
    entry_time__gte=last_24h,
    stage=1,
    contact__in=valid_contacts
)

方案二:直接在Testmodel1查询中通过反向关联计数

from django.db.models import Count, Q
import arrow

last_24h = arrow.utcnow().shift(hours=-24).datetime

result = Testmodel1.objects.filter(
    entry_time__gte=last_24h,
    stage=1
).annotate(
    # 统计当前contact关联的所有符合条件的Testmodel1数量
    contact_tm1_count=Count(
        'contact__testmodel1',
        filter=Q(contact__testmodel1__entry_time__gte=last_24h, contact__testmodel1__stage=1)
    )
).filter(
    contact_tm1_count__gt=3
)

额外的模型检查点

为了确保查询正常工作,还需要确认模型定义的正确性:

  • Testmodel1的stage字段应该是models.ChoiceField(你写的choicesfiled是拼写错误),并且stage=1是该字段的合法选项值。
  • ForeignKey需要添加on_delete参数,比如contact = models.ForeignKey(Testmodel2, on_delete=models.CASCADE),这是Django的必填参数。

你可以通过print(result.query)查看生成的SQL语句,验证查询逻辑是否符合预期。

内容的提问来源于stack exchange,提问作者Prashant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:40:19