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
相关产品推荐
相关产品推荐

