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

DRF接口开发:获取指定用户未使用的下一条章节提示

解决方案:获取用户未使用的下一条提示

问题分析

你之前的查询无法得到结果,核心原因是条件矛盾:

  • hint_activity=None 筛选的是没有任何关联GameActivity记录的提示
  • hint_activity__user=curr_user 筛选的是存在关联GameActivity且属于当前用户的提示
    这两个条件不可能同时满足,因此查询结果为空。

正确实现方式

方式1:排除用户已使用的提示(简洁直观)

curr_user = self.request.user

# 获取当前用户所有已使用过的提示ID
used_hint_ids = GameActivity.objects.filter(
    user=curr_user,
    activity_hint__isnull=False  # 确保关联的提示不为空
).values_list('activity_hint_id', flat=True)

# 查询指定章节中未被使用的提示,按级别升序取第一条
next_hint = Hint.objects.filter(
    chapter__url_key=chapter_uuid
).exclude(
    id__in=used_hint_ids
).order_by('hint_level').first()

方式2:使用子查询(性能更优,避免两次数据库查询)

from django.db.models import Subquery, OuterRef

curr_user = self.request.user

# 子查询:匹配当前用户已使用的提示
used_hints_subquery = GameActivity.objects.filter(
    user=curr_user,
    activity_hint_id=OuterRef('id')
).values('id')

# 过滤指定章节、未被当前用户使用的提示,按级别升序取第一条
next_hint = Hint.objects.filter(
    chapter__url_key=chapter_uuid
).exclude(
    id__in=Subquery(used_hints_subquery)
).order_by('hint_level').first()

补充:最初需求(返回章节中未被任何用户使用的提示)

如果需要回到你最初的需求(不区分用户,返回章节中从未被使用过的第一条提示),可以用以下查询:

from django.db.models import Subquery, OuterRef

# 子查询:获取所有被使用过的提示
all_used_hints = GameActivity.objects.filter(
    activity_hint_id=OuterRef('id')
).values('id')

unused_hint = Hint.objects.filter(
    chapter__url_key=chapter_uuid
).exclude(
    id__in=Subquery(all_used_hints)
).order_by('hint_level').first()

内容的提问来源于stack exchange,提问作者Bring Coffee Bring Beer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:55:17