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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:45:31