django-idcops 平台之前一直都没开发在线设备导入的功能,刚好一些定制的系统有这个功能的需求,所以便把批量导入在线设备的功能完善了。
Django 框架中数据的导入和导出有很大的区别,导出的时候可以利用框架model已有的数据解析方法将数据按照一定的规则导出。
而导入则需要根据具体model开发相关的数据解耦方法才能继续进行,idcops 中大量使用了必填外键,必填字符串,多对多这种model字段类型。因此,在开发批量导入在线设备这一功能时就需要写更多的耦合函数。
面向对象,把idcops中Online这个模型的字段类型了解一波先:
(env) PS C:\Users\shoutian\Desktop\django-idcops> python .\manage.py shell>>> from idcops.models import Online>>> for f in Online._meta.get_fields(): f, "{} 必填:{}".format(f.verbose_name, not f.blank)... (, 'ID 必填:False')(, '系统标记 必填:False')(, '创建人 必填:True')(, '修改人 必填:False')(, '创建日期 必填:True')(, '修改日期 必填:False')(, '已启用 必填:False')(, '已删除 必填:False')(, '所属机房 必填:False')(, '设备编号 必填:True')(, '所属机柜 必填:True')(, '所属客户 必填:True')(, '设备SN号 必填:True')(, 'IP地址 必填:False')(, '设备型号 必填:True')(, '设备类型 必填:True')(, '状态 必填:True')(, '设备U位 必填:False')(, 'PDU接口 必填:False')(, '设备标签 必填:False')(, '备注信息 必填:False')>>>
进一步提取必须填写的字段如下:
>>> for f in Online._meta.get_fields(): (f, f.verbose_name) if not f.blank else None ... (, '创建人')(, '创建日期')(, '设备编号')(, '所属机柜')(, '所属客户')(, '设备SN号')(, '设备型号')(, '设备类型')(, '状态')>>>
因在线设备涉及到机柜中展示具体所在位置,所以,设备U位也是必填的,它是一个多对多字段。另外还有pdus和tags是可选填的多对多字段。最终整理的字段如下:
>>> must_fields = [f.name for f in Online._meta.get_fields() if not f.blank] >>> extra = ['units', 'pdus', 'tags']>>> must_fields + extra['creator', 'created', 'name', 'rack', 'client', 'sn', 'model', 'style', 'status', 'units', 'pdus', 'tags&#