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

如何用Django REST Framework反序列化处理含缺失字段的嵌套JSON入库

解决DRF反序列化处理特殊JSON数据的问题

我来帮你搞定这个DRF反序列化的难题!针对你遇到的XML转JSON后嵌套$层级、部分数据缺失estbDd的情况,咱们可以分三步处理,轻松把数据存入数据库:

第一步:预处理原始数据,拆解嵌套+补全缺失字段

首先得把原始数据里嵌套在$里的值提取出来,同时处理那些没有estbDd的条目,避免报错。写个简单的处理函数就行:

def process_raw_data(raw_items):
    processed_list = []
    for item in raw_items:
        cleaned_item = {
            # 直接提取XPos和YPos里的$值
            'x_pos': item['XPos']['$'],
            'y_pos': item['YPos']['$'],
            # 处理缺失的estbDd:如果没有这个字段,返回None(适配数据库的空值)
            'estb_dd': item.get('estbDd', {}).get('$')
        }
        processed_list.append(cleaned_item)
    return processed_list

这里用dict.get()方法很关键:即使某个条目没有estbDd,item.get('estbDd', {})会返回一个空字典,再调用.get('$')就会得到None,不会触发KeyError。

第二步:定义数据库模型和DRF序列化器

假设你的数据库模型是这样的(根据实际需求调整字段类型):

from django.db import models

class LocationModel(models.Model):
    x_pos = models.FloatField(verbose_name="经度")
    y_pos = models.FloatField(verbose_name="纬度")
    # 用CharField存原始日期字符串,或者转成DateField都可以
    estb_dd = models.CharField(max_length=8, null=True, blank=True, verbose_name="成立日期")

    class Meta:
        verbose_name = "位置信息"

然后对应的DRF序列化器,用来验证和入库:

from rest_framework import serializers
from .models import LocationModel

class LocationSerializer(serializers.ModelSerializer):
    # 如果想把estb_dd转成日期类型,加这个字段配置(需要模型对应字段是DateField)
    # estb_dd = serializers.DateField(input_formats=['%Y%m%d'], required=False)
    
    class Meta:
        model = LocationModel
        fields = ['x_pos', 'y_pos', 'estb_dd']

如果你的estb_dd要存成日期类型,记得把模型里的字段改成DateField(null=True, blank=True),然后序列化器里加上上面注释的配置,这样DRF会自动把19100907这样的字符串转成日期对象。

第三步:在视图里实现批量插入

用DRF的批量序列化功能,一次性把处理好的数据插入数据库:

from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import LocationSerializer
from .utils import process_raw_data # 假设处理函数放在utils.py里

class BulkLocationCreateView(APIView):
    def post(self, request):
        # 拿到原始数据(比如前端传来的,或者你本地的列表)
        raw_data = request.data
        # 先预处理数据
        processed_data = process_raw_data(raw_data)
        # 用many=True实现批量序列化验证
        serializer = LocationSerializer(data=processed_data, many=True)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            return Response({"msg": "数据批量插入成功"}, status=201)
        return Response(serializer.errors, status=400)

这样整个流程就通了:原始数据先经过预处理,拆解嵌套的$、处理缺失字段,再交给DRF序列化器验证,最后批量存入数据库。

内容的提问来源于stack exchange,提问作者Jiwon Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:10:26