首页 > 解决方案 > 使用嵌套序列化程序 Django REST 框架获取 n 条随机记录

问题描述

我正在尝试从外键相关模型中获取随机的“n”条记录。假设我有两个名为Exam和的模型Questions。我需要一个 API 端点来获取一个特定主题的 n 个问题(例如数学,n 个随机数学问题)。端点在检索特定主题的所有问题方面运行良好。

模型.py

class Exam(models.Model):
   
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class Question(models.Model):
    
    exam = models.ForeignKey(Exam, on_delete=models.CASCADE)
    question = models.CharField(max_length=255)

    def __str__(self):
        return '{} - {}'.format(self.question)

序列化程序.py

class QuestionSerializer(serializers.ModelSerializer):
    
    questions = serializers.CharField(read_only=True)
    answer = serializers.CharField(read_only=True)

    class Meta:
        model = Question
        fields = '__all__'


class ExamSerializer(serializers.ModelSerializer):
    
    name = serializers.CharField(read_only=True)
    questions = QuestionSerializer(many=True, read_only=True, source='question_set')

    class Meta:
        model = Exam
        fields = '__all__'

api_views.py

class ExamQuestionRetrieveAPIView(generics.RetrieveAPIView):

    authentication_classes = [JWTTokenUserAuthentication]

    serializer_class = ExamSerializer
    queryset = Exam.objects.all()
    lookup_field = 'name'

浏览完文档后,我尝试使用该to_representation()方法过滤并获取随机记录,但失败了。任何帮助是极大的赞赏。

标签: djangodjango-modelsdjango-rest-frameworkdjango-serializer

解决方案


如果您想要 1 次考试的 N 个随机问题,我会执行以下操作:

  • 在 Viewset(或自定义视图)中创建自定义操作
    • 它应该是一个 DETAIL 模型动作,这意味着它看起来像exams/3/your-action-name/
    • 它应该是一个 GET 请求
  • 然后实现如下逻辑:
    • 获取考试模型
    • 然后获取该考试的问题,使用"?"随机排序它们,只需要几个
    • 然后序列化问题实例
    • 并返回数据

这是它的样子:

def get_random_questions(self, request, pk=None):
    exam = self.get_object()
    questions = Question.objects.filter(exam=exam).order_by("?")[:5] # Update with your desired number
    serializer = QuestionSerializer(questions, many=True)
    return Reponse(serializer.data)

推荐阅读