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

如何筛选Django中created_at超过30天的Product模型对象?

问题解决:Django获取创建时间超过30天的对象

你的模型定义

from django.db import models
class Product(models.Model):
     name=models.CharField(max_length=100)
     created_at=models.DateTimeField(auto_now_add=True)

你尝试的代码(无法生效)

from django.db.models import  F
from django.utils import timezone

Product.objects.annotate(diff_date=(timezone.now()-F('created_at'))).filter(diff_date__days__gte=30)

问题原因

你这种写法的问题在于:Django ORM没办法在数据库层面直接解析timedelta类型的diff_date字段的days属性,diff_date__days__gte=30这种查询方式不被支持,导致过滤逻辑失效。

正确解决方案

换个思路,直接计算30天前的时间点,然后过滤created_at早于或等于这个时间点的对象。这种写法不仅能正常生效,还能利用created_at字段的索引,查询性能更优。

代码示例:

from django.utils import timezone

# 计算30天前的时间
thirty_days_ago = timezone.now() - timezone.timedelta(days=30)
# 过滤创建时间早于等于30天前的产品
old_products = Product.objects.filter(created_at__lte=thirty_days_ago)

补充说明

如果你的created_at是不带时区的字段(推荐用时区支持的DateTimeField),可以用datetime模块替代timezone:

import datetime

thirty_days_ago = datetime.datetime.now() - datetime.timedelta(days=30)
old_products = Product.objects.filter(created_at__lte=thirty_days_ago)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:45:39