Django REST Framework多对多字段JSON响应格式调整求助
解决Django REST Framework中多对多关系的JSON响应格式问题
嘿,我来帮你搞定这个响应格式的问题!你现在遇到的情况是因为多对多关系在使用values()查询时会被拆分成多条记录,而我们需要把同一个Opponent的Features合并成一个数组。下面是具体的解决方案:
问题根源
你当前在视图中使用Opponent.objects.all().values('id', 'features')查询数据,由于Opponent和Feature是多对多关联,这个查询会返回每条关联关系的单独条目,所以同一个Opponent的每个Feature都会生成一条记录,这就是为什么你看到的响应是拆分后的格式。
解决方案:使用DRF序列化器处理关联关系
DRF的序列化器天生擅长处理模型间的关联关系,我们可以通过定义合适的序列化器来直接生成你想要的格式:
1. 修正序列化器(serializers.py)
我们需要为Opponent定义序列化器,把Features序列化成名称数组:
from rest_framework import serializers from .models import Opponent, Feature class OpponentSerializer(serializers.ModelSerializer): # 利用StringRelatedField直接获取Feature的__str__返回值(也就是name) features = serializers.StringRelatedField(many=True) class Meta: model = Opponent fields = ('id', 'features')
如果之后需要Feature的更多字段,也可以单独定义Feature的序列化器:
class FeatureSerializer(serializers.ModelSerializer): class Meta: model = Feature fields = ('name',) # 然后在OpponentSerializer中使用: features = FeatureSerializer(many=True, read_only=True)
2. 简化视图(views.py)
去掉自定义的jsonify装饰器,改用DRF自带的api_view和Response,它们会自动处理JSON序列化和OPTIONS请求:
from rest_framework.decorators import api_view from rest_framework.response import Response from .models import Opponent from .serializers import OpponentSerializer @api_view(['GET', 'OPTIONS']) def get_opponents(request): opponents = Opponent.objects.all() serializer = OpponentSerializer(opponents, many=True) return Response(serializer.data)
验证结果
现在请求这个接口,返回的JSON就会是你期望的格式:
[ { "id": 1, "features": ["feature1", "feature2"] } ]
这样修改后,不仅解决了格式问题,还利用了DRF的原生能力,代码更简洁也更符合DRF的最佳实践。
内容的提问来源于stack exchange,提问作者Philippe
相关产品推荐
相关产品推荐

