如何按createdAt获取Ticket模型的每条最后记录并输出指定JSON格式?
解决方案
1. 关联字段说明
目标JSON中的部分字段未在提供的Ticket模型中定义,需先明确关联模型的对应字段:
itineraire(路线):推测来自Bus模型的字段(如route)Driver(司机):推测来自User模型的字段(如full_name)vente-par-cash(现金销售额)、pu(单价):推测为Ticket模型的字段(需确保模型中已定义,如cash_sales、unit_price)
2. 查询每日最新记录
通过Django ORM先按日期分组,获取每个日期的最新createdAt时间,再关联回Ticket表拿到对应记录:
from django.db.models import Max from django.utils import timezone from datetime import timedelta # 定义今日、昨日日期 today = timezone.now().date() yesterday = today - timedelta(days=1) # 分组获取每个日期的最新创建时间 latest_date_entries = Ticket.objects.values('createdAt__date').annotate(latest_created=Max('createdAt')) # 筛选出对应最新时间的Ticket记录,预加载关联模型提升性能 latest_tickets = Ticket.objects.filter( createdAt__in=[entry['latest_created'] for entry in latest_date_entries] ).select_related('user', 'bus', 'PDA')
3. 格式化并输出目标JSON
将查询结果按today、yesterday分组,转换为指定结构的JSON:
import json result = {"today": [], "yesterday": []} for ticket in latest_tickets: ticket_date = ticket.createdAt.strftime("%d/%m/%Y") # 构建单条记录的字典结构 item = { "itineraire": ticket.bus.route if ticket.bus else "", "PDA": ticket.PDA.name if ticket.PDA else "", "Bus": ticket.bus.code if ticket.bus else "", "Driver": ticket.user.full_name if ticket.user else "", "date": ticket_date, "vente-par-cash": str(ticket.cash_sales) if hasattr(ticket, 'cash_sales') else "0", "pu": str(ticket.unit_price) if hasattr(ticket, 'unit_price') else "0" } # 按日期分组 if ticket.createdAt.date() == today: result["today"].append(item) elif ticket.createdAt.date() == yesterday: result["yesterday"].append(item) # 输出格式化后的JSON print(json.dumps(result, indent=4, ensure_ascii=False))
4. 注意事项
- 若关联模型的字段名与假设不同,需自行调整代码中的字段引用
- 若
Ticket模型未定义cash_sales、unit_price字段,需补充字段或替换为实际存在的字段 - 如需支持更多日期分组,可扩展逻辑动态生成日期键
内容的提问来源于stack exchange,提问作者David Tship
相关产品推荐
相关产品推荐

