如何在Django REST Framework的views.py中随机返回题目?
实现Django REST Framework题目随机返回的方案
要让两个接口返回随机排序的题目,只需在查询结果后添加Django ORM的随机排序方法即可,具体修改如下:
修改views.py中的get_queryset方法
在两个类的get_queryset方法里,对过滤后的QuerySet调用.order_by('?')实现随机排序,同时可以用get_object_or_404优化异常处理(避免找不到对象时抛出500错误):
from django.shortcuts import get_object_or_404 from rest_framework import generics import models class QuizQuetionsList(generics.ListAPIView): serializer_class=QuizQuetionsSerializer def get_queryset(self): quiz_id=self.kwargs['quiz_id'] quiz = get_object_or_404(models.Quiz, pk=quiz_id) # 添加order_by('?')实现随机排序 return models.QuizQuetions.objects.filter(quiz=quiz).order_by('?') class QuizChapterQuetionsList(generics.ListAPIView): serializer_class=QuizQuetionsSerializer def get_queryset(self): quizChapter_id=self.kwargs['quizChapter_id'] quizChapter = get_object_or_404(models.QuizChapter, pk=quizChapter_id) # 添加order_by('?')实现随机排序 return models.QuizQuetions.objects.filter(quizChapter=quizChapter).order_by('?')
原理说明
order_by('?')是Django ORM提供的随机排序方式,它会让数据库执行随机排序逻辑,返回打乱顺序的QuerySet。- 用
get_object_or_404替代原有的get方法,当指定ID的Quiz或QuizChapter不存在时,会返回标准的404响应,比直接抛出异常更符合REST API的规范。
注意事项
如果题目数量非常大(比如上万条),order_by('?')可能会有性能问题,此时可以考虑其他方式,比如在模型中添加随机字段,或者用Python层面的随机打乱(但会失去分页优化),不过一般题库场景下order_by('?')足够使用。
内容的提问来源于stack exchange,提问作者hedi salm
相关产品推荐
相关产品推荐

