我有 Course 和 CourseComment 模型。在课程详细信息视图中,我应该返回课程的详细信息以及用户的评论。我已经为课程详细信息和课程评论制作了序列化器。但 coursecomment_set 字段为空。我为课程写了几条评论。
这是我的模型、序列化器和模型
# views.py ---> Course Details API View
class CourseDetailsView(generics.RetrieveAPIView):
queryset = models.Course.objects.select_related('category')
serializer_class = serializers.CourseDetailSerializer
lookup_field = 'slug'
# models.py ---> Course model
class Course(BaseModel):
LEVEL_TYPES = (
('beginner', 'Beginner'),
('intermediate', 'Intermediate'),
('advanced', 'Advanced'),
)
LANGUAGES = (
('uz', 'O`zbek tili'),
('en', 'Ingliz tili'),
('ru', 'Rus tili'),
)
title = models.CharField(max_length=128)
author = models.CharField(max_length=128)
price = models.PositiveIntegerField(default=0)
level = models.CharField(choices=LEVEL_TYPES, max_length=16)
description = models.TextField()
category = models.ForeignKey('CourseCategory', on_delete=models.CASCADE)
lessons_count = models.PositiveIntegerField(default=0)
language = models.CharField(choices=LANGUAGES, max_length=2, default='uz')
rating = models.DecimalField(max_digits=2, decimal_places=1, default=0)
slug = models.SlugField(unique=True, blank=True)
# Comments model
class CourseComment(models.Model):
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
body = models.TextField()
rating = models.DecimalField(decimal_places=1, max_digits=2)
# serializers.py ---> Course Comments Serializer
class CourseCommentSerializer(serializers.ModelSerializer):
class Meta:
model = CourseComment
fields = ('user', 'body', 'rating')
# Course details
class CourseDetailSerializer(serializers.ModelSerializer):
coursecomment_set = CourseCommentSerializer(many=True, read_only=True)
class Meta:
model = Course
fields = "__all__"
查看返回响应,但评论是空的,我在每门课程的数据库中有几条评论
要在序列化器中包含每个课程的注释,您可以在视图中使用 Prefetch 对象。以下是修改 CourseDetailsView 以包含评论的方法:
from django.db.models import Prefetch
class CourseDetailsView(generics.RetrieveAPIView):
queryset = models.Course.objects.select_related('category').prefetch_related(
Prefetch('coursecomment_set', queryset=models.CourseComment.objects.all())
)
serializer_class = serializers.CourseDetailSerializer
lookup_field = 'slug'