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

如何在Django Serializer中获取外键字段的详细信息(而非ID)

解决Django Serializer返回外键详细字段而非ID的问题

你的问题核心在于当前的序列化逻辑只返回了外键的ID值,没有关联取出VideoCategory的name字段。这里有两种简洁的解决方式,你可以根据实际需求选择:

方法一:通过嵌套序列化器关联获取详细字段

先定义一个针对VideoCategory的基础序列化器,再在VideoCategoryVideoSerializer里嵌套使用它,直接获取目标字段:

# 先新增VideoCategory的序列化器
class VideoCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = VideoCategory
        fields = ('name',)  # 只返回需要的name字段,也可以加其他字段

# 修改原有的VideoCategoryVideoSerializer
class VideoCategoryVideoSerializer(serializers.ModelSerializer):
    # 用嵌套序列化器替代默认的外键ID返回
    category = VideoCategorySerializer()
    class Meta:
        model = VideoCategoryVideo
        fields = ('category', )

这样修改后,原有的VideosDetailsListSerializer不需要改动,就能返回包含name的分类数据了。这种方式的好处是扩展性强,如果之后需要返回VideoCategory的其他字段(比如image),直接修改VideoCategorySerializer的fields即可。

方法二:直接在SerializerMethodField中构造返回数据

如果只需要name这一个字段,也可以跳过中间序列化器,直接在get_category方法里构造结果,同时用select_related避免N+1查询优化性能:

class VideosDetailsListSerializer(serializers.ModelSerializer):
    category = serializers.SerializerMethodField()
    class Meta:
        model = Video
        fields = ('id', 'create_date', 'category')
    
    def get_category(self, data):
        # 使用select_related预加载关联的category,避免多次数据库查询
        cate_items = VideoCategoryVideo.objects.filter(video=data.id).select_related('category')
        # 直接构造需要的字典格式
        return [{'name': item.category.name} for item in cate_items]

两种方法都能实现你期望的"category": [ { "name": "cate_name" }]返回格式,根据你的实际业务场景选就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:52:36