Django查询distinct记录随机返回行,如何获取每个card_id最新价格数据
问题根因
你当前使用的distinct('card_id')未指定排序规则,数据库返回的去重匹配行是随机选取的,不会自动返回每个card_id对应最新时间的记录。
PostgreSQL 适配方案
如果你的项目使用PostgreSQL作为数据库,可直接通过distinct结合排序规则实现需求,该写法性能最优:
pricing_cards.objects.filter( card_id__rarity='mythic' ).order_by( 'card_id', # 必须和distinct的参数保持一致 '-datetime' # 按时间倒序,保证每个card_id下最新记录排在分组首位 ).distinct( 'card_id' ).values_list('nonfoil', flat=True)
核心逻辑是先按card_id分组,组内按时间倒序排列,distinct('card_id')只会取每个分组的第一条结果,也就是对应最新时间的记录。
全数据库兼容方案
如果使用不支持带参distinct的数据库(如MySQL),可通过子查询先定位每个card_id的最新时间,再关联取对应记录:
from django.db.models import Max, Subquery, OuterRef # 子查询:获取每个card_id对应的最新时间 latest_time_subquery = pricing_cards.objects.filter( card_id=OuterRef('card_id') ).values('card_id').annotate( latest_time=Max('datetime') ).values('latest_time')[:1] # 主查询:匹配最新时间取对应价格 result = pricing_cards.objects.filter( card_id__rarity='mythic', datetime=Subquery(latest_time_subquery) ).values_list('nonfoil', flat=True)
- 注意:以上代码中的
datetime为示例时间字段名,若你的表中存储时间的字段命名不同,请替换为实际字段名。
内容的提问来源于stack exchange,提问作者Ross
相关产品推荐
相关产品推荐

