zoukankan      html  css  js  c++  java
  • django 导入Excel文件 ORM 批量操作

    导入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'u66f4u6539u5730u56feu6807u9898'
    >>> print u'u66f4u6539u5730u56feu6807u9898'
    更改地图标题
    >>> 

    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
    []
    >>> 
  • 相关阅读:
    SDUT 2143 图结构练习——最短路径 SPFA模板,方便以后用。。 Anti
    SDUT ACM 1002 Biorhythms 中国剩余定理 Anti
    nyist OJ 119 士兵杀敌(三) RMQ问题 Anti
    SDUT ACM 2157 Greatest Number Anti
    SDUT ACM 2622 最短路径 二维SPFA启蒙题。。 Anti
    二叉索引树 区间信息的维护与查询 Anti
    SDUT ACM 2600 子节点计数 Anti
    UVA 1428 Ping pong 二叉索引树标准用法 Anti
    2010圣诞Google首页效果
    Object
  • 原文地址:https://www.cnblogs.com/wangmin0216/p/5960963.html
Copyright © 2011-2022 走看看