django - 使用嵌套序列化程序 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()
方法过滤并获取随机记录,但失败了。任何帮助是极大的赞赏。
解决方案
如果您想要 1 次考试的 N 个随机问题,我会执行以下操作:
- 在 Viewset(或自定义视图)中创建自定义操作
- 它应该是一个 DETAIL 模型动作,这意味着它看起来像
exams/3/your-action-name/
- 它应该是一个 GET 请求
- 它应该是一个 DETAIL 模型动作,这意味着它看起来像
- 然后实现如下逻辑:
- 获取考试模型
- 然后获取该考试的问题,使用
"?"
随机排序它们,只需要几个 - 然后序列化问题实例
- 并返回数据
这是它的样子:
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)
推荐阅读
- python - 如何保存 jupyter notebook 内核的状态?
- javascript - 没有错误,但没有出现所需的屏幕
- sql - 如何替换从 XML 读取的多个值并将其存储到 SQL 数据库
- java - 数据库中每个事务的通知
- ajax - Drupal 8表单提交Ajax表单后的回调
- ios - 有没有办法在使用 expo 的 react-native 中根据电话语言翻译上下文菜单?
- java - apache lucene 的更新使用方式
- amazon-web-services - Amazon S3 可公开读取的存储桶是否损坏
- javascript - 匹配输出的两个数组索引位置
- mongodb - Docker 容器意外失败