如何筛选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
相关产品推荐
相关产品推荐

