DjangoRestFramework & Javascript Fetch获取关联模型额外数据问题
解决方案
完全可以实现你需要的返回格式,Django REST Framework提供了多种关联字段序列化方案,以下是两种最简便的实现方式:
方案1:使用source参数直接映射关联字段(推荐)
这是最简洁的实现方式,不需要额外编写方法,直接在CarSerializer中新增字段映射关联表的name属性即可:
# serializers.py from rest_framework import serializers class CarSerializer(ModelSerializer): # 新增字段,source指定关联对象的属性,read_only设置为只读避免提交校验报错 manufacturer__name = serializers.CharField(source='manufacturer.name', read_only=True) class Meta: model = Car exclude = [ 'date_created', ]
方案2:使用SerializerMethodField自定义字段逻辑
如果后续需要对关联字段做额外逻辑处理,可以用这种方式:
# serializers.py from rest_framework import serializers class CarSerializer(ModelSerializer): manufacturer__name = serializers.SerializerMethodField() def get_manufacturer__name(self, obj): # obj为当前Car实例,直接取关联的Manufacturer的name属性 return obj.manufacturer.name class Meta: model = Car exclude = [ 'date_created', ]
性能优化建议
为了避免序列化时产生N+1查询问题,建议修改视图中的查询语句,用select_related提前加载关联的Manufacturer数据:
# views.py @api_view(['GET']) def api_list_card(request): # 用select_related提前拉取外键关联数据,减少数据库查询次数 qs = Car.objects.select_related('manufacturer').all() serializer = CarSerializer(qs, many=True) return Response(serializer.data)
修改完成后接口返回的格式就和你期望的完全一致了。
内容的提问来源于stack exchange,提问作者finethen
相关产品推荐
相关产品推荐

