如何使用Django Rest Framework根据子类别筛选展示对应问题
解决方案
你只需要修改view.py中question_list接口的GET请求逻辑,新增子类别ID的查询参数过滤即可,具体修改如下:
1. 编辑view.py代码
找到GET请求的处理逻辑,新增subcategory_id过滤代码:
@api_view(['GET', 'POST', 'DELETE']) def question_list(request): if request.method == 'GET': questions = Question.objects.all() # 原有按问题内容模糊过滤的逻辑 question = request.GET.get('question', None) if question is not None: questions = questions.filter(question__icontains=question) # 新增按子类别ID过滤的逻辑 subcategory_id = request.GET.get('subcategory_id', None) if subcategory_id is not None: questions = questions.filter(subcategory_id=subcategory_id) questions_serializer = QuestionSerializer(questions, many=True) return JsonResponse(questions_serializer.data, safe=False) # 剩下的POST、DELETE逻辑保持不变,沿用原有代码即可
注:Django会自动为ForeignKey字段生成
字段名_id格式的数据库存储字段,因此这里直接用subcategory_id过滤是合法的,也可以写成subcategory__id,效果完全一致。
2. 调用方式
修改完成后,要获取数学类的问题,直接请求以下地址即可:GET /api/questions?subcategory_id=1
因为数学子类别的subcategory_id为1,接口就只会返回该类别下的2条问题。
可选拓展:支持按子类别名称过滤
如果需要更直观的调用方式,也可以新增按子类别名称过滤的逻辑,在GET处理部分补充以下代码:
# 新增按子类别名称模糊过滤的逻辑 subcategory_name = request.GET.get('subcategory_name', None) if subcategory_name is not None: questions = questions.filter(subcategory__subcategory__icontains=subcategory_name)
之后调用GET /api/questions?subcategory_name=Mathematics也能拿到数学类的问题。
内容的提问来源于stack exchange,提问作者Aras121
相关产品推荐
相关产品推荐

