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

如何在Django/DRF中获取ManyToMany字段的对象而非ID?

在Django REST Framework中返回关联对象而非ID的解决方案

当你用DRF返回ArticlesModel数据时,ManyToMany字段默认只返回ID列表,要返回完整的关联对象,常用这几种解决办法:

1. 嵌套序列化器(最灵活)

给TagsModel和ImagesModel分别写对应的序列化器,然后在ArticlesSerializer里直接引用这些序列化器来处理关联字段。

示例代码:

from rest_framework import serializers
from .models import TagsModel, ImagesModel, ArticlesModel

# 先定义关联模型的序列化器
class TagsSerializer(serializers.ModelSerializer):
    class Meta:
        model = TagsModel
        fields = ('id', 'name')  # 按需指定要返回的字段,也可以用__all__返回全部

class ImagesSerializer(serializers.ModelSerializer):
    class Meta:
        model = ImagesModel
        fields = ('id', 'url', 'alt_text')

# 再定义文章的序列化器,嵌套关联序列化器
class ArticlesSerializer(serializers.ModelSerializer):
    # many=True表示是多对多关系,read_only=True确保只做序列化输出
    tags = TagsSerializer(many=True, read_only=True)
    images = ImagesSerializer(many=True, read_only=True)
    # 外键字段也可以用同样方式处理,比如author = AuthorSerializer(read_only=True)

    class Meta:
        model = ArticlesModel
        fields = ('id', 'title', 'content', 'tags', 'images')  # 列出需要返回的文章字段

这样序列化后,返回的文章数据里,tags和images就会是包含完整字段的对象数组,而不是单纯的ID列表。

2. 使用depth属性(快速实现)

如果不需要自定义关联对象的返回字段,直接在ArticlesSerializer的Meta类里设置depth参数,指定嵌套深度即可自动序列化关联对象。

示例代码:

class ArticlesSerializer(serializers.ModelSerializer):
    class Meta:
        model = ArticlesModel
        fields = '__all__'
        depth = 1  # 表示序列化一层关联对象,适合简单场景

这种方式的缺点是无法自定义关联对象的返回字段,会返回关联模型的所有字段,适合快速验证需求但灵活性不足的场景。

3. 预加载关联数据(性能优化)

不管用上面哪种序列化方式,都建议在查询文章时预加载关联的tags和images,避免DRF执行多次数据库查询(N+1问题)。

在APIView中实现:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import ArticlesModel
from .serializers import ArticlesSerializer

class ArticlesListView(APIView):
    def get(self, request):
        # prefetch_related用于多对多关系,外键用select_related
        articles = ArticlesModel.objects.all().prefetch_related('tags', 'images')
        serializer = ArticlesSerializer(articles, many=True)
        return Response(serializer.data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:45:31