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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:40:26