0


学会这个Python技能,就可以跟excel说再见了

资产登记,可能你想很简单,自己维护一份excel表不就行了吗?

但它和设备的采购、维护和管理息息相关。

领导可能随时问你“小宋,还剩多少内存条可以用啊?要不要申请维修a啊?”你一脸懵逼,反怼领导一句:这和我有什么关系?

好像是没什么关系,所以我坚持用excel登记了几千条IT资产信息,每次打开慢的一匹。不信的话,看看我的劳动成果:

图片

累计电脑设备超过1000条,类型8种

图片

型号如戴尔台式主机OptiPlex的3020,7040,7060,9020系类,品牌包括戴尔、三星、苹果、宏基等等。

这些有逻辑关系的数据,通过excel简单去添加,显然还是没有逻辑,说好的excel高效办公呢?我仔细看了会表格,又发现很多重复的内容,比如明明是相同型号,配置一样的,登记了几遍:

图片

这不是优秀的桌面维护人员该有的表格,咱不是文员,花9块9去学那种“七天学会excel”、“文员办公必学五大函数”的课程价值不大。简单一点,该删则删,该改则改,所以我整理了一遍表格,设计字段,用django去管理这些信息:

完整代码在这里 https://gitee.com/sswfit/asset.git

图片

不吹不黑,立马轻松了很多:

  • 编辑模式批量修改

图片

  • “+”“-”按钮动态增删搜索条件

图片

  • 添加3个按钮“添加资产”、“添加型号”、“添加领用人”

这样简单直接,刷刷刷几下,登记资产就很轻松了。

有哪些值得注意的地方呢?

表格的整理

  1. 每条资产一行数据。

比如我领用了2个显示器,那就是2条资产,2行数据,而不是在excel中合并内容。

  1. 去掉配置等多余的列

因为相同型号的配置是一样的,它可以在数据库中作为

型号

的外键。

经过整理,1068条减少到340条,瘦身成功:

图片

  1. xlrd模块将数据存入数据库

xlrd的2.0.1版本,只支持.xls文件,读取.xlsx会报错。所以安装旧版xlrd:

pip uninstall xlrd
pip installxlrd==1.2.0

将整理后的info.xlsx写入django数据库:

import xlrd
from datetime import datetime
from api import models

data = xlrd.open_workbook('d:/asset/api/info.xlsx')
table = data.sheet_by_name('Sheet1')
style_list =[]for i inrange(table.nrows):iftype(table.row_values(i)[0])isfloatandtype(table.row_values(i)[1])isfloat:# x为表里的“购置时间”
        x = xlrd.xldate_as_datetime(table.row_values(i)[0],0)# y为表里的“领用时间”
        y = xlrd.xldate_as_datetime(table.row_values(i)[1],0)
        data_list = table.row_values(i)#把表里的'2015年12月11日'格式转换为'2015-12-11'
        data_list[0]= x.strftime('%Y-%m-%d')
        data_list[1]= y.strftime('%Y-%m-%d')#django的Employee表
        employee_id = models.Employee.objects.filter(name=data_list[2]).first().id
        data_list[2]= employee_id
        style_id = models.Style.objects.filter(name=data_list[4]).first().id
        data_list[4]= style_id
        style_list.append(data_list[4])else:print('xx')print(data_list)

data_list结果如下:

['2019-08-05','2019-08-19','空闲','SZMN1908006','戴尔 E2417H',880.0,'']

输出的值就是表格里的最后一行

图片

字段设计

根据整理好的excel设计表结构,分为

型号表、资产类型表、部门表、员工表、配置表、资产表

。重点是

Models

型号表,它外键关联到

Type

资产类型表,一对一关联

Configuration

配置表

models.py

#型号表classModels(models.Model):
    name = models.CharField(max_length=32)type= models.ForeignKey('Type',to_field='id',related_name='type_name',on_delete=models.CASCADE,verbose_name='类别')
    configure = models.OneToOneField(to='Configuration',on_delete=models.CASCADE,verbose_name='配置',null=True,blank=True)#资产类型表,如手机、显示器等不同的资产类型classType(models.Model):
    name = models.CharField(max_length=32,verbose_name='类别')#部门表classDepartment(models.Model):
    name = models.CharField(max_length=32)#员工表classEmployee(models.Model):
    name = models.CharField(max_length=32,verbose_name='员工姓名')
    dept = models.ForeignKey('Department',on_delete=models.CASCADE,verbose_name='部门')#资产的配置(内存、cpu等)classConfiguration(models.Model):
    cpu = models.CharField(max_length=32,blank=True,null=True)
    mem = models.CharField(max_length=32,blank=True,null=True,verbose_name='内存')
    harddisk = models.CharField(max_length=32,blank=True,null=True,verbose_name='硬盘')
    gpu = models.CharField(max_length=32,blank=True,null=True,verbose_name='显卡')
    screen = models.CharField(max_length=32,blank=True,null=True,verbose_name='显示器',default='N')
    note = models.CharField(max_length=32,blank=True,null=True,verbose_name='备注')def__str__(self):return'CPU:%s 内存:%s 硬盘:%s 显卡:%s 显示器:%s 备注:%s'%(self.cpu,self.mem,self.harddisk,self.gpu,self.screen,self.note)#资产表classAsset(models.Model):
    supplier_type_choices =((1,'N'),(2,'戴尔'),(3,'苹果'),)
    status_choices =((1,'空闲'),(2,'使用'),(3,'报废'),(4,'待确认'))
    mod = models.ForeignKey('Models',on_delete=models.CASCADE,verbose_name='型号')
    purchase_at = models.DateField(verbose_name='购买时间')
    price = models.CharField(max_length=32, verbose_name='价格',blank=True,null=True)
    recipient = models.ForeignKey('Employee',on_delete=models.CASCADE,verbose_name='领用人')
    recipient_at =  models.DateField(null=True,blank=True,verbose_name='领用时间')
    sn = models.CharField(max_length=32,verbose_name='资产编号')
    supplier = models.IntegerField(choices=supplier_type_choices,default=3,verbose_name='供应商')
    after_sales = models.CharField(max_length=128,blank=True,null=True,verbose_name='售后联系方式')
    status = models.IntegerField(choices=status_choices,default=1,verbose_name='状态')
    note = models.CharField(max_length=64,blank=True,null=True,verbose_name='备注',default='')def__str__(self):return self.sn
Type

表,表示资产类型,如手机、显示器:

图片

Configuration

表,表示资产的配置(内存、cpu等),可灵活添加:

图片

Models

表,表示型号,如红米k20 pro,关联上面2个表:

图片

Asset

表,表示每一条资产:

图片

领用人怎么排序的

图片

红框内的姓名按abcd顺序排序用到pypinyin模块,在另一篇“我用django偷偷绑定员工MAC信息”用它给员工分配过邮箱

# recipient领用人
recipient_list = list(models.Employee.objects.values('id','name'))
recipient_list.sort(key=lambda x:lazy_pinyin(x['name']))

逻辑处理

逻辑还是比较简单的,后端先把需要的信息准备好,前端在页面初始化的时候拿到这些数据就可以做各种文章了。

举个🌰,怎么让搜索条件在下拉框中显示呢?

图片

首先,定义一个url,它的作用就是把所有需要的数据提前准备好,一个json大字典

url(r'asset-json',views.AssetJsonView.as_view(),name='asset-json'),

对应的处理函数AssetJsonView:

图片

然后配置前端,一打开页面就获取这个json大字典

图片

可以直接访问 http://ssw.fit:8081/asset-json 看到这些数据:

图片

第二个红框里

357 itmes

就是数据库里的357条资产信息,全部在这个大字典里了。剩下的就是前端html怎么显示这些和javascript逻辑处理。

当然,光提供数据还不够,AssetJsonView还处理批量修改,保存按钮就是提交给它的put()方法:

图片

put方法:

图片

主页面对应的url

http://ssw.fit:8081/asset-0-0/, 它的url表示:

 url(r'^asset-(?P<mod__type_id>\d+)-(?P<status>\d+)/$', views.handle_asset, name="asset")

作用主要是根据搜索条件过滤资产结果。

对应的处理函数:

defhandle_asset(request,*args,**kwargs):

    username = request.session.get('username')#取出所有资产类型
    type_list = models.Type.objects.all()#资产当前的状态,空闲还是在使用
    status_list = models.Asset.status_choices

    #搜索条件放到一个字典里
    condition ={}
    r = reverse('asset',kwargs=kwargs)for k,v in kwargs.items():
        kwargs[k]=int(v)if v =='0':passelse:
            condition[k]= v
    arg_dict = kwargs

    #分页
    current_page = request.GET.get('p',1)
    current_page =int(current_page)
    total_count = models.Asset.objects.all().count()#根据搜索条件过滤资产结果
    asset_list = models.Asset.objects.filter(**condition)[obj.db_start:obj.db_end]if request.method =='GET':
        q = request.GET.get('q')if q:
            rep = models.Employee.objects.filter(name__icontains=q).first()if rep:
                asset_list = rep.asset_set.filter(**condition)return render(request,'asset.html',{'username': username,'assets': asset_list,'type_list': type_list, \
                                                      'status_list': status_list,'arg_dict': arg_dict,'q':q})else:print('无此用户')return render(request,'asset.html',{'username':username,'assets':asset_list,'type_list':type_list,\
                                        'status_list':status_list,'arg_dict':arg_dict})

可以克隆下来,看下前后端具体处理过程

git clone https://gitee.com/sswfit/asset.git

#启动方法
python manage.py runserver localhost:8080
python manage.py makemigrations
python manage.py migrate

#安装xlrd
pip install -r requirements.txt

#访问
http://localhost:8080/asset-0-0/

小结

这个案例挺实用的,因为增删改查的场景很多。

可以个人用,也可以帮同事朋友设计一个。

跟在电脑上打开一个记事本一样,随手记录资产,随手修改。

而且,可以作为IT信息管理体系的一部分,

向领导报告,我为规范企业IT设备管理做出了实际行动。


本文转载自: https://blog.csdn.net/qq_34160248/article/details/127253205
版权归原作者 Python数据挖掘 所有, 如有侵权,请联系我们删除。

“学会这个Python技能,就可以跟excel说再见了”的评论:

还没有评论