如何使用Django获取JSON API数据并存入Car模型?
从JSON API导入汽车数据到Django的Car模型
先确认Car模型结构
确保models.py中的Car模型包含name和model字段,示例如下:
from django.db import models class Car(models.Model): name = models.CharField(max_length=100) model = models.CharField(max_length=100) def __str__(self): return f"{self.name} {self.model}"
步骤1:安装依赖
需要用requests库请求API,执行以下命令安装:
pip install requests
方法一:快速脚本导入
在项目根目录创建import_cars.py,写入以下代码(替换你的项目和应用名称、API地址):
import requests import django import os # 配置Django环境变量 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "你的项目名称.settings") django.setup() from 你的应用名称.models import Car def import_cars(api_url): try: # 请求API数据 resp = requests.get(api_url) resp.raise_for_status() # 捕获HTTP错误 cars_list = resp.json() # 遍历数据,用get_or_create避免重复创建 for car_data in cars_list: Car.objects.get_or_create( name=car_data["name"], model=car_data["model"] ) print(f"成功处理{len(cars_list)}条汽车数据") except requests.exceptions.RequestException as e: print(f"API请求失败: {str(e)}") except KeyError as e: print(f"API数据格式错误,缺失字段: {str(e)}") if __name__ == "__main__": # 替换为你的API地址 import_cars("https://your-api-endpoint.com/cars")
运行脚本:
python import_cars.py
方法二:Django自定义命令(推荐)
这种方式更符合Django项目规范,支持通过manage.py调用:
- 在你的应用目录下创建
management/commands文件夹(需包含空的__init__.py文件) - 在
commands文件夹中新建import_cars.py,写入:
from django.core.management.base import BaseCommand import requests from 你的应用名称.models import Car class Command(BaseCommand): help = "从指定JSON API导入汽车数据到Car模型" def add_arguments(self, parser): # 添加API URL作为命令参数 parser.add_argument('api_url', type=str, help='汽车数据API的完整URL') def handle(self, *args, **options): api_url = options['api_url'] try: resp = requests.get(api_url) resp.raise_for_status() cars_list = resp.json() created = 0 updated = 0 for car_data in cars_list: obj, is_created = Car.objects.get_or_create( name=car_data["name"], model=car_data["model"] ) if is_created: created += 1 else: updated += 1 self.stdout.write(self.style.SUCCESS(f"导入完成!新增{created}条,更新{updated}条数据")) except requests.exceptions.RequestException as e: self.stderr.write(self.style.ERROR(f"API请求失败: {str(e)}")) except KeyError as e: self.stderr.write(self.style.ERROR(f"数据格式错误,缺失字段: {str(e)}"))
- 运行命令(替换为你的API地址):
python manage.py import_cars https://your-api-endpoint.com/cars
大数据量优化
如果API返回的数据量很大,建议用bulk_create批量插入提升效率,替换导入逻辑如下:
# 获取已有汽车的名称+型号组合,避免重复 existing_cars = Car.objects.values_list('name', 'model') existing_pairs = set((car[0], car[1]) for car in existing_cars) new_car_objs = [] for car_data in cars_list: pair = (car_data["name"], car_data["model"]) if pair not in existing_pairs: new_car_objs.append(Car(name=car_data["name"], model=car_data["model"])) if new_car_objs: Car.objects.bulk_create(new_car_objs) print(f"批量新增{len(new_car_objs)}条数据")
内容的提问来源于stack exchange,提问作者Mazen Mamdouh
相关产品推荐
相关产品推荐

