導入excel文件后批量插入"bulk_create"方法
1.先定義數據模型
from django.db import models from django.utils.translation import ugettext_lazy as _ ACTIVE_TYPE = ( (1, _(u"已激活")), (0, _(u"未激活")), ) class Unit(models.Model): """ 社會單位 """ id = models.AutoField(primary_key=True, editable=False) name = models.CharField(_(u"單位名稱"), max_length=100, unique=True, db_index=True) address = models.CharField(_(u"單位地址"), max_length=100, null=True, blank=True, db_index=True) contactperson = models.CharField(_(u"聯系人"), max_length=30, null=True, blank=True, db_index=True) contactnumber = models.CharField(_(u"聯系人電話"), max_length=30, null=True) rc_group_id = models.CharField(_(u"融雲群組ID"), default=uuid.uuid1, editable=False, max_length=36) rc_group_name = models.CharField(_(u"融雲群組名"), max_length=50, null=True, editable=True) longitude = models.DecimalField(_(u"經度"), max_digits=9, decimal_places=6, null=True, blank=False, default=31.184111) latitude = models.DecimalField(_(u"緯度"), max_digits=9, decimal_places=6, null=True, blank=False, default=121.58611) active = models.SmallIntegerField(_(u"狀態"), choices=ACTIVE_TYPE, db_index=True, null=False, editable=False, default=1) device_operation_password = models.CharField(_(u"操作密碼"), max_length=4, editable=True, null=True) map_title = models.CharField(_(u"地圖標題"), max_length=30, null=True, blank=True, db_index=True)
2.下面是導入excel文件返回字典數據,用字典來接收數據是因為"Unit"的name屬性為unique,所有用name作為key值去重
# coding: utf-8 import xlrd import uuid import random def excel_table_by_name(file_excel='/home/kevin/下載/danwei_11.xlsx', col_name_index=0, by_name=u'Sheet1'): """ 根據名稱獲取Excel表格中的數據 參數: file_excel:Excel文件路徑 col_name_index:表頭列名所在行的所以 by_name:Sheet1名稱 """ data = xlrd.open_workbook(file_excel) table = data.sheet_by_name(by_name) n_rows = table.nrows # 行數 col_names = table.row_values(col_name_index) # 某一行數據 row_dict = {} for row_num in range(1, n_rows): row = table.row_values(row_num) row_dict[row[0]] = row[1] return row_dict def import_unit_batch(): data = excel_table_by_name() from ..models.model_unit import Unit # from ..models.model_appname import AppName # from ..models.model_monitor import Monitor, BRANCH_TYPE_DICT unit_list = [] # app_names = AppName.objects.filter(id__in=(12, 13)) for k, v in data.items(): longitude_latitude = v.split(',') unit_obj = Unit.objects.filter(name=k) if not unit_obj: new_unit = Unit( contactnumber='13' + str("%09d" % random.randint(0, 999999999)), longitude=longitude_latitude[1], latitude=longitude_latitude[0], rc_group_id=uuid.uuid1(), rc_group_name=k, active=1, device_operation_password='1718', name=k, map_title='地圖', ) unit_list.append(new_unit) Unit.objects.bulk_create(unit_list)
excel 的格式為
單位 | 經緯度 |
單位1 | 121.6455545,29.56565 |
單位2 | 121.6455545,29.56566 |
3.批量更新對象,以下代碼相當於 update unit where id >= 703;
>>> from mysite.manage.models.model_unit import Unit >>> units = Unit.objects.filter(id__gte=703) >>> units.update(map_title='更改地圖標題') 983L >>> units[0].map_title u'\u66f4\u6539\u5730\u56fe\u6807\u9898' >>> print u'\u66f4\u6539\u5730\u56fe\u6807\u9898' 更改地圖標題 >>>
4.批量刪除對象,以下代碼相當於 delete from unit where id >= 703;
>>> from mysite.manage.models.model_unit import Unit >>> units = Unit.objects.filter(id__gte=703) >>> len(units) 983 >>> units.delete() >>> units [] >>>