如何从DRF获取{key:value}格式响应?数据库选型疑问
解决方案
一、修改DRF返回格式为{key: value}
当前你的Serializer返回的是包含service_key和service_value的字典列表,只需在视图中对序列化后的数据做转换即可:
修改视图代码
from rest_framework.decorators import api_view from rest_framework import status from rest_framework.response import Response from .models import Service, ServiceKey from .serializers import KeySerializer @api_view(['GET', ]) def hello(request): name = request.query_params.get('service') try: service = Service.objects.get(name=name) service_key_instance = ServiceKey.objects.filter(service=service) serializer = KeySerializer(instance=service_key_instance, many=True) # 将列表转换为目标格式的字典 config_data = {item['service_key']: item['service_value'] for item in serializer.data} return Response(data=config_data, status=status.HTTP_200_OK) except Service.DoesNotExist: return Response(data='record not found', status=status.HTTP_404_NOT_FOUND) except Exception: return Response(data='request error', status=status.HTTP_400_BAD_REQUEST)
补充:Serializer示例
如果你的KeySerializer是默认的ModelSerializer,结构如下:
from rest_framework import serializers from .models import ServiceKey class KeySerializer(serializers.ModelSerializer): class Meta: model = ServiceKey fields = ('service_key', 'service_value')
二、换成MongoDB是否有帮助?
有帮助,但并非必要:
- MongoDB作为文档型数据库,天然支持灵活的键值对结构,你可以直接将Service的配置存储为嵌套字典字段,查询时直接返回该字段就能得到
{key: value}格式,无需额外转换。 - 但换数据库需要考虑迁移成本:现有SQL数据的迁移、团队技术栈适配、事务/ACID特性的取舍等。如果当前SQL数据库能满足其他业务需求,仅为格式问题换库性价比很低。
三、其他解决方案
1. 使用Django的JSONField(推荐)
直接在Service模型中新增JSON字段存储配置,省去ServiceKey关联表:
from django.db import models class Service(models.Model): name = models.TextField() version = models.IntegerField() config = models.JSONField(default=dict) # 存储键值对配置
此时视图只需查询Service模型,直接返回service.config即可,代码更简洁:
@api_view(['GET', ]) def hello(request): name = request.query_params.get('service') try: service = Service.objects.get(name=name) return Response(data=service.config, status=status.HTTP_200_OK) except Service.DoesNotExist: return Response(data='record not found', status=status.HTTP_404_NOT_FOUND)
注:PostgreSQL 9.4+、SQLite 3.31+、MySQL 5.7+均支持JSONField。
2. 自定义Serializer的输出逻辑
重写Serializer的to_representation方法,让单条记录返回{key: value},再在视图中合并为一个字典:
class KeySerializer(serializers.ModelSerializer): class Meta: model = ServiceKey fields = () def to_representation(self, instance): return {instance.service_key: instance.service_value}
视图中合并数据:
config_data = {} for item in serializer.data: config_data.update(item)
内容的提问来源于stack exchange,提问作者Konstantinos
相关产品推荐
相关产品推荐

