Django Rest Framework 中的反向关系

问题描述 投票:0回答:1

我有 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__"

查看返回响应,但评论是空的,我在每门课程的数据库中有几条评论

python django django-rest-framework foreign-keys django-serializer
1个回答
0
投票

要在序列化器中包含每个课程的注释,您可以在视图中使用 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'
© www.soinside.com 2019 - 2024. All rights reserved.