django 批量导入数据

简介:

一、需求

我在数据库中建了一张表,用来保存ucloud云上的project id 和project name

models.py代码如下

1
2
3
4
5
6
7
8
9
10
#coding:utf-8
from  django.db  import  models
 
class  Project(models.Model):
     name  =  models.CharField(u '项目名称' ,max_length = 32 ,blank = True )
     id  =  models.CharField(u '项目ID' ,max_length = 32 ,unique = True ,primary_key = True ,blank = True )
     create_date  =  models.DateTimeField(u '创建时间' , auto_now_add = True )
     update_date  =  models.DateTimeField(u '更新时间' , auto_now = True )
     def  __unicode__( self ):
         return  self .name


admin.py代码如下

1
2
3
4
5
6
from  django.contrib  import  admin
from  ucloud.models  import  *
 
class  ProjectAdmin(admin.ModelAdmin):
     list_display  =  [ 'name' , 'id' ]
admin.site.register(Project,ProjectAdmin)

wKioL1i9NH_Dw8mwAABy5EJOxGo519.png

二、批量导入脚本

现在,我准备了一个脚本,通过UcloudAPI获取到了线上所有的项目的项目ID和项目名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
#-*-coding:utf8-*-
from  Ucloud_API.config  import  *
from  Ucloud_API.sdk  import  UcloudApiClient
from  models  import  *
 
def  get_project_info():
     ApiClient  =  UcloudApiClient(base_url, public_key, private_key)
     Parameters  =  {
         "Action" "GetProjectList"
     }
     response  =  ApiClient.get( "/" , Parameters)
     ids  =  [
         { 'ProjectId' : _[ 'ProjectId' ],  'ProjectName' : _[ 'ProjectName' ]}
         for  in  response[ 'ProjectSet' ]
         ]
     return  ids
1
2
##脚本执行结果如下
[{ 'ProjectId' : u 'org-81' 'ProjectName' : u '\u4e0a\u6d77\u522b\u6837\u7ea2\u4fe1\u606f\u6280\u672f\u6709\u9650\u516c\u53f8' }, { 'ProjectId' : u 'org-ja1wvv' 'ProjectName' : u '\u5907\u6848\u4e13\u7528' }, { 'ProjectId' : u 'org-wrg10n' 'ProjectName' : u 'gitlab' }, { 'ProjectId' : u 'org-pni2a2' 'ProjectName' : u 'PublicTest' }, { 'ProjectId' : u 'org-kbxrx4' 'ProjectName' : u 'SPMS' }, { 'ProjectId' : u 'org-aws3dj' 'ProjectName' : u '\u5b89\u5168\u6d4b\u8bd5' }, { 'ProjectId' : u 'org-vzfixt' 'ProjectName' : u 'OTA' }, { 'ProjectId' : u 'org-et55qg' 'ProjectName' : u '99\u6570\u636e\u540c\u6b65\u4e2d\u8f6c\uff0c\u672c\u9879\u76ee\u4e0e99\u5185\u7f51\u6253\u901a\uff0c\u4e0d\u5141\u8bb8\u6dfb\u52a0\u4efb\u4f55\u673a\u5668' }, { 'ProjectId' : u 'org-ghan2t' 'ProjectName' : u 'Ops' }, { 'ProjectId' : u 'org-qf4d2n' 'ProjectName' : u 'iPms' }]

ProjectId对象表中的id字段,ProjectName对应表中的name字段。


下面是批量导入数据的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python
#-*-coding:utf8-*-
from  Ucloud_API.config  import  *
from  Ucloud_API.sdk  import  UcloudApiClient
from  models  import  *
 
##通过API获取数据
def  get_project_info():
     ApiClient  =  UcloudApiClient(base_url, public_key, private_key)
     Parameters  =  {
         "Action" "GetProjectList"
     }
     response  =  ApiClient.get( "/" , Parameters)
     ids  =  [
         { 'ProjectId' : _[ 'ProjectId' ],  'ProjectName' : _[ 'ProjectName' ]}
         for  in  response[ 'ProjectSet' ]
         ]
     return  ids
 
##批量导入数据
def  update_project_info():
     info  =  get_project_info()
     pids  =  []
     for  in  info:
         projectid  =  _[ 'ProjectId' ]
         pids.append(projectid)
         project  =  None
         try :
             project  =  Project.objects.get(pk = projectid)
         except  Project.DoesNotExist:
             project  =  Project(pk = projectid)
         project.name  =  _[ 'ProjectName' ]
         project.save()
     # 删除本地有但是ucloud上没有的项目
     projectids  =  [_[ 'pk' for  in  Project.objects. all ().values( 'pk' )]
     diff_ids  =  list ( set (projectids).difference( set (pids)))
     Project.objects. filter (pk__in = diff_ids).delete()

这里导入数据的思路如下:

1
2
3
4
try :
     project  =  Project.objects.get(pk = projectid)
except  Project.DoesNotExist:
     project  =  Project(pk = projectid)

先通过get方法获取对象,如果对象bu'存在,则用下面的方法创建该对象

1
project  =  Project(pk = projectid)

如果对象存在,通过下面的方法更新ProjectName

1
2
project.name  =  _[ 'ProjectName' ]
project.save()


另外还有一个需要注意的地方是,数据库中的数据要更新。

例如:线上之前有一个项目aaa,但是后来被删除了,那么则需要从数据库中删除该对象。

使用以下方法;

1
2
3
projectids  =  [_[ 'pk' for  in  Project.objects. all ().values( 'pk' )]
diff_ids  =  list ( set (projectids).difference( set (pids)))
Project.objects. filter (pk__in = diff_ids).delete()

将数据库中的对象列表转换成集合,将线上获取到的对象列表也转换成集合,然后通过

1
set1.difference(set2)

的方法来获取在set1中存在,但在set2中不存在的对象,然后用下面的方法删除

1
Project.objects. filter (pk__in = diff_ids).delete()


批量导入数据还可以使用下面的方法执行

1
2
3
4
5
6
7
8
9
10
def  update_project_info():
     info  =  get_project_info()
     pids  =  [_[ 'ProjectId' for  in  info]
     for  in  info:
         Project.objects.get_or_create( id = i[ 'ProjectId' ],name = i[ 'ProjectName' ])
     projectids  =  [_[ 'pk' for  in  Project.objects. all ().values( 'pk' )]
     #获取数据库中存在,但线上不存在的projectid
     diff_ids  =  list ( set (projectids).difference( set (pids)))
     #删除数据库中多余的数据
     Project.objects. filter (pk__in = diff_ids).delete()
1
Project.objects.get_or_create( id = i[ 'ProjectId' ],name = i[ 'ProjectName' ])

 get_or_create() 有就获取过来,没有就创建,用它可以避免重复,但是速度可以会慢些,因为要先尝试获取,看看有没有


三、如何执行脚本

我们可以将导入数据的方法通过问url的方式,来执行

1
2
3
4
5
6
7
8
9
10
#coding:utf-8
from  django.shortcuts  import  render
from  django.http  import  HttpResponse,JsonResponse
from  sdkucloud  import  *
# Create your views here.
def  index(request):
     return  HttpResponse( 'index' )
def  pull_project(request):
     update_project_info()
     return  HttpResponse( 'OK!' )

编辑$APPName/urls.py

1
2
3
4
5
6
7
from  django.conf.urls  import  include, url
from  django.contrib  import  admin
from  ucloud.views  import  *
urlpatterns  =  [
     url(r '^$' ,  index),
     url(r '^pull_project/$' , pull_project)
]










本文转自 曾哥最爱 51CTO博客,原文链接:http://blog.51cto.com/zengestudy/1903718,如需转载请自行联系原作者

目录
相关文章
|
6月前
|
前端开发 JavaScript BI
Django教程第5章 | Web开发实战-数据统计图表(echarts、highchart)
使用echarts和highcharts图表库实现折线图、柱状图、饼图和数据集图
161 2
|
6月前
|
设计模式 JSON 前端开发
前后端配置动态的数据字段标签(django_vue)
前后端配置动态的数据字段标签(django_vue)
52 0
|
25天前
|
JavaScript 前端开发 Python
django接收前端vue传输的formData图片数据
django接收前端vue传输的formData图片数据
25 4
|
25天前
|
搜索推荐 关系型数据库 MySQL
#874358#基于django/neo4j的电视剧浏览数据推荐系统
#874358#基于django/neo4j的电视剧浏览数据推荐系统
19 0
|
3月前
|
数据采集 自然语言处理 监控
【优秀python毕设案例】基于python django的新媒体网络舆情数据爬取与分析
本文介绍了一个基于Python Django框架开发的新媒体网络舆情数据爬取与分析系统,该系统利用Scrapy框架抓取微博热搜数据,通过SnowNLP进行情感分析,jieba库进行中文分词处理,并以图表和词云图等形式进行数据可视化展示,以实现对微博热点话题的舆情监控和分析。
123 2
【优秀python毕设案例】基于python django的新媒体网络舆情数据爬取与分析
|
3月前
|
监控 数据可视化 前端开发
基于python django生产数据与计划大屏,可链接数据库
本文介绍了一个基于Python Django框架开发的生产数据与计划大屏系统,该系统能够实时采集和展示生产数据,支持数据可视化和实时更新,以提高生产监控的效率和质量。
|
3月前
|
API 数据库 开发者
【独家揭秘】Django ORM高手秘籍:如何玩转数据模型与数据库交互的艺术?
【8月更文挑战第31天】本文通过具体示例详细介绍了Django ORM的使用方法,包括数据模型设计与数据库操作的最佳实践。从创建应用和定义模型开始,逐步演示了查询、创建、更新和删除数据的全过程,并展示了关联查询与过滤的技巧,帮助开发者更高效地利用Django ORM构建和维护Web应用。通过这些基础概念和实践技巧,读者可以更好地掌握Django ORM,提升开发效率。
39 0
|
3月前
|
数据可视化 安全 前端开发
基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据
本文介绍了一个基于Django框架开发的美团药品数据分析与可视化系统,该系统具备多用户功能,支持数据的增删改查操作,并采用MySQL、pandas、echarts和bootstrap技术栈,为用户提供了一个高效、安全且实用的药品数据管理和分析平台。
基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据
|
3月前
|
关系型数据库 MySQL Python
[django]数据的导入和导出
[django]数据的导入和导出
|
5月前
|
JSON 搜索推荐 数据库
Django REST framework数据展示技巧:分页、过滤与搜索的实用配置与实践
Django REST framework数据展示技巧:分页、过滤与搜索的实用配置与实践