如何在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
相关产品推荐
相关产品推荐

