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

Django REST框架中基于RetrieveAPIView实现Category与关联Course查询集的整合方案问询

解决方法:通过DRF嵌套序列化实现关联课程的嵌套返回

你的核心需求是在获取单个分类详情时,把该分类下的所有课程一并返回成嵌套的JSON结构。当前代码的问题在于你试图直接修改QuerySet对象(它不是字典,不能直接赋值键值对),而且没有利用DRF的序列化能力来处理关联数据。下面是正确的实现方式:

1. 定义课程序列化器

首先你需要一个CourseSerializer来序列化课程数据:

from rest_framework import serializers
from .models import Category, Course

class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = ['id', 'category', 'title', 'active']

2. 修改分类序列化器,添加嵌套课程字段

在CategorySerializer中,通过嵌套序列化器来关联课程。这里我们用CourseSerializer并设置many=True来返回完整的课程列表:

class CategorySerializer(serializers.ModelSerializer):
    # 这里的courses对应Category模型的反向关联名称,默认是模型名小写_set(即course_set)
    # 如果你想自定义名称,可以在Course的外键字段添加related_name参数,比如related_name='courses'
    courses = CourseSerializer(many=True, read_only=True)

    class Meta:
        model = Category
        fields = ['id', 'name', 'courses']

注意:如果你的Course模型的外键没有设置related_name,那么默认的反向关联名称是course_set,这时候你需要把上面的courses改成course_set,或者在Course的外键字段添加related_name='courses'来匹配序列化器字段名:

# 修改Course模型的外键字段
category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, related_name='courses')

3. 优化视图,避免N+1查询问题

虽然你的DictView继承RetrieveAPIView后可以直接工作,但为了避免每次获取分类都要额外查询一次课程(N+1性能问题),建议在查询时预加载关联的课程:

from rest_framework.generics import RetrieveAPIView
from .models import Category
from .serializers import CategorySerializer

class DictView(RetrieveAPIView):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

    def get_queryset(self):
        # 预加载关联的courses,减少数据库查询次数
        return Category.objects.prefetch_related('courses')

最终效果

当你访问/dict/61/时,返回的JSON结构会和你期望的完全一致:

{
  "id": 61,
  "name": "fgfdf",
  "courses": [
    {
      "id": 1,
      "category": 61,
      "title": "mytitle",
      "active": true
    },
    ...
  ]
}

额外说明

  • 如果你不需要返回课程的所有字段,只需要调整CourseSerializer的fields列表即可。
  • 如果你的课程数量极大,可以考虑对嵌套课程做分页处理,但RetrieveAPIView是获取单个对象的场景,小数量列表直接返回即可。

内容的提问来源于stack exchange,提问作者SJ19

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:07:42