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

Django实现JSON接收解析及数据访问API端点的方案咨询

解决方案

首先明确两个核心前提:

  1. 你提到的JSON中8类带属性的结构,标准术语是JSON对象,同结构的多条数据组成对象数组,单条JSON对象对应Django模型的一条数据库记录,一类固定结构的对象数组对应一个Django模型。
  2. 如果这8类结构的字段是固定的,必须为每类结构单独创建模型,后续查询、校验、性能都有保障;如果字段完全动态无固定规则,可以用单模型+JSONField的方案存储,但不推荐。

你已经安装了Django REST Framework,完全可以基于DRF快速实现三个需求接口,具体实现步骤如下:

1. 模型定义

在models.py中,为每类JSON结构定义对应模型,字段和JSON中的属性一一对应即可,示例(以2类结构为例,剩余6类按相同范式编写):

from django.db import models

# 示例:对应JSON中product类结构
class Product(models.Model):
    # 字段完全匹配JSON中product对象的属性
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    description = models.TextField(blank=True, null=True)

# 示例:对应JSON中user类结构
class User(models.Model):
    username = models.CharField(max_length=100, unique=True)
    email = models.EmailField()
    age = models.IntegerField(blank=True, null=True)

# 剩余6类结构按上述逻辑,根据JSON属性补全对应模型即可

写完模型后执行python manage.py makemigrations、python manage.py migrate完成数据库表创建。

2. 建立模型与序列化器映射

为了实现动态根据URL传入的模型名匹配对应资源,不需要写大量分支判断,提前维护两个映射字典即可。
首先在serializers.py中编写对应序列化器:

from rest_framework import serializers
from .models import Product, User
# 导入剩余6个自定义模型

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

# 剩余6个模型的序列化器按相同逻辑编写,无需额外逻辑

然后在app下新建utils.py维护映射关系:

from .models import Product, User
# 导入剩余6个模型
from .serializers import ProductSerializer, UserSerializer
# 导入剩余6个对应序列化器

# key为URL中传入的模型名称,value为对应模型类
MODEL_MAP = {
    "product": Product,
    "user": User,
    # 补全剩余6个模型的映射
}

# key为URL中传入的模型名称,value为对应序列化器类
SERIALIZER_MAP = {
    "product": ProductSerializer,
    "user": UserSerializer,
    # 补全剩余6个序列化器的映射
}

3. 接口视图实现

在views.py中基于DRF的APIView实现三个接口:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.http import Http404
from django.shortcuts import get_object_or_404
from .utils import MODEL_MAP, SERIALIZER_MAP

class ImportDataView(APIView):
    """
    POST /import 接收JSON数据并导入数据库
    接收的JSON格式示例:
    {
        "product": [{"name":"商品1", "price":99, "description":"测试商品"}],
        "user": [{"username":"zhangsan", "email":"zhangsan@test.com", "age":20}]
    }
    """
    def post(self, request):
        receive_data = request.data
        created_total = 0
        error_list = []

        for model_name, record_list in receive_data.items():
            if model_name not in MODEL_MAP:
                error_list.append(f"非法资源类型: {model_name}")
                continue
            model_cls = MODEL_MAP[model_name]
            serializer_cls = SERIALIZER_MAP[model_name]

            for record in record_list:
                serializer = serializer_cls(data=record)
                if serializer.is_valid():
                    serializer.save()
                    created_total += 1
                else:
                    error_list.append(f"类型{model_name}记录{record}导入失败: {serializer.errors}")
        
        return Response(
            {"created_count": created_total, "errors": error_list},
            status=status.HTTP_200_OK if created_total else status.HTTP_400_BAD_REQUEST
        )

class ModelListView(APIView):
    """GET /detail/<model_name> 返回指定类型的所有记录"""
    def get(self, request, model_name):
        if model_name not in MODEL_MAP:
            raise Http404("请求的资源不存在")
        model_cls = MODEL_MAP[model_name]
        serializer_cls = SERIALIZER_MAP[model_name]
        all_records = model_cls.objects.all()
        result = serializer_cls(all_records, many=True).data
        return Response(result)

class ModelDetailView(APIView):
    """GET /detail/<model_name>/<id> 返回指定类型下对应ID的单条记录"""
    def get(self, request, model_name, id):
        if model_name not in MODEL_MAP:
            raise Http404("请求的资源不存在")
        model_cls = MODEL_MAP[model_name]
        serializer_cls = SERIALIZER_MAP[model_name]
        record = get_object_or_404(model_cls, id=id)
        result = serializer_cls(record).data
        return Response(result)

4. 路由配置

在app的urls.py中添加路由:

from django.urls import path
from .views import ImportDataView, ModelListView, ModelDetailView

urlpatterns = [
    path("import", ImportDataView.as_view(), name="data-import"),
    path("detail/<str:model_name>", ModelListView.as_view(), name="model-list"),
    path("detail/<str:model_name>/<int:id>", ModelDetailView.as_view(), name="model-detail"),
]

把该urls.py挂载到项目根路由即可生效。

可选优化点

  • 如果单次导入数据量超过1000条,把循环serializer.save()换成DRF的批量创建或者Django原生bulk_create,可以大幅提升导入速度。
  • 如果需要权限控制、分页、过滤功能,直接在对应视图中加DRF提供的对应类即可,不需要改动核心逻辑。
  • 如果JSON结构存在嵌套关联,可以在序列化器中添加嵌套序列化逻辑实现关联数据的导入和返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:24:22