如何通过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管理命令(推荐新手)
- 在你的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}'))
- 在终端执行命令导入数据:
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
相关产品推荐
相关产品推荐

