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

如何通过Django或Django Rest Framework获取在线URL的JSON数据并存入RDBMS?

如何用Django/DRF从URL获取JSON并保存到关系型数据库

嗨,作为Python和Django新手,你的问题完全没问题——这是非常常见的入门场景!下面我会一步步帮你搞定从获取JSON数据到存入数据库的全流程,尽量用简单易懂的方式讲解。


第一步:获取URL中的JSON数据

首先你需要从目标URL拉取JSON数据。Python里最适合新手的工具是requests库(Django不自带,需要单独安装),它的语法比内置的urllib简洁太多。

  • 先安装requests:
pip install requests
  • 编写获取数据的函数:
import requests

def fetch_json(url):
    try:
        # 发送GET请求
        response = requests.get(url)
        # 检查请求是否成功(比如404、500会抛出异常)
        response.raise_for_status()
        # 把JSON字符串转成Python字典/列表
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"请求出错了:{e}")
        return None

# 调用示例
target_url = "http://json-data.com"
json_data = fetch_json(target_url)

response.json()会直接帮你完成JSON解析,得到的json_data就是可以直接操作的Python数据结构,非常方便。


第二步:在Django中定义对应的数据模型

要把数据存入关系型数据库,你需要先在Django的models.py里定义和JSON结构匹配的模型。比如假设你的JSON数据是这样的:

[
    {
        "id": 1,
        "name": "Alice",
        "email": "alice@example.com"
    },
    {
        "id": 2,
        "name": "Bob",
        "email": "bob@example.com"
    }
]

对应的模型可以这么写:

from django.db import models

class UserData(models.Model):
    # 用external_id对应JSON里的id,避免和Django自带的id冲突
    external_id = models.IntegerField(unique=True)
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)

    def __str__(self):
        return self.name

写完模型后,记得执行迁移命令创建数据库表:

python manage.py makemigrations
python manage.py migrate

第三步:将JSON数据存入Django数据库

现在你有了JSON数据和模型,接下来就是把数据映射到模型实例并保存。推荐用Django管理命令的方式(适合手动触发或定时执行),或者在视图中处理(适合通过HTTP请求触发)。

方式一:写一个Django管理命令(推荐新手)

  1. 在你的app目录下创建management/commands文件夹(没有的话直接新建),然后新建import_json_data.py文件:
from django.core.management.base import BaseCommand
import requests
from your_app_name.models import UserData  # 替换成你的app名和模型名

class Command(BaseCommand):
    help = "从指定URL导入JSON数据到数据库"

    def add_arguments(self, parser):
        # 允许命令接收URL参数
        parser.add_argument('url', type=str, help='JSON数据的目标URL')

    def handle(self, *args, **options):
        url = options['url']
        try:
            response = requests.get(url)
            response.raise_for_status()
            json_data = response.json()

            # 遍历JSON数据,存入数据库
            for item in json_data:
                # 用get_or_create避免重复导入相同数据
                UserData.objects.get_or_create(
                    external_id=item['id'],
                    defaults={
                        'name': item['name'],
                        'email': item['email']
                    }
                )
            self.stdout.write(self.style.SUCCESS('数据导入成功!'))
        except requests.exceptions.RequestException as e:
            self.stdout.write(self.style.ERROR(f'请求失败:{e}'))
        except KeyError as e:
            self.stdout.write(self.style.ERROR(f'JSON数据缺少必要字段:{e}'))
  1. 在终端执行命令导入数据:
python manage.py import_json_data http://json-data.com

方式二:在视图中处理(通过HTTP请求触发)

如果想通过访问某个页面触发导入,可以写一个简单的视图:

from django.http import HttpResponse
import requests
from .models import UserData

def import_json(request):
    target_url = "http://json-data.com"
    try:
        response = requests.get(target_url)
        response.raise_for_status()
        json_data = response.json()

        for item in json_data:
            UserData.objects.get_or_create(
                external_id=item['id'],
                defaults={'name': item['name'], 'email': item['email']}
            )
        return HttpResponse("数据导入成功!")
    except Exception as e:
        return HttpResponse(f"导入失败:{str(e)}", status=500)

然后在urls.py配置路由:

from django.urls import path
from .views import import_json

urlpatterns = [
    path('import-json/', import_json, name='import_json'),
]

访问http://你的域名/import-json/就能触发数据导入了。


关于Django Rest Framework的补充

DRF主要用来构建API,它本身没有直接提供拉取URL JSON的工具,但可以结合DRF的序列化器来更规范地处理数据验证和转换:

from rest_framework import serializers
from .models import UserData

class UserDataSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserData
        fields = ['external_id', 'name', 'email']

# 导入数据时使用序列化器
serializer = UserDataSerializer(data=json_data, many=True)
if serializer.is_valid():
    serializer.save()

序列化器会自动验证数据格式是否符合模型要求,避免脏数据存入数据库,更安全可靠。


最后几个注意点

  • 异常处理:一定要处理请求失败、JSON格式错误、字段缺失等异常,避免程序崩溃。
  • 去重逻辑:用get_or_create或者先查询再创建,防止重复导入相同数据。
  • 性能优化:如果JSON数据量很大,记得分批处理,避免一次性加载太多数据到内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:22:26