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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:57:01