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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:31:19