Django - CMDB 项目学习 - 对Client传输的数据进行对数据库内数据的增删改操作(Server端数据处理)
目录
一、数据信息的处理 - 磁盘信息(可改进)
重点总结
- new_slot_list = list(new_disk_info.keys()) - list的使用,获取字典的key值形成列表
![]()
- tmp = "增加磁盘槽位{slot}, 类型{pd_type}, 容量{capacity}, 型号{model}".format(**disk_res)
- format + ** - 基于字典的批量录入
![]()
- recoder_str = ";".join(recoder_list) - 字符串的拼接
![]()
- del_slot_list = set(old_slot_list).difference(set(new_slot_list)) - 集合的交并补差等操作的使用
def asset(request): if request.method == 'GET': ''' 基于Client端传输的GET信息做请求用户的校验 ''' elif request.method == 'POST': ''' 只针对硬盘信息进行增删改操作的核心逻辑测试,应该编码成可插拔形式 ''' # 新资产信息 new_server_info = json.loads(request.body) # 老资产信息 hostname = new_server_info['basic']['data']['hostname'] old_server_obj = models.Server.objects.filter(hostname=hostname).first() if not old_server_obj: return HttpResponse('当前主机名未录入') # 若新资产内状态码非成功码,则录入采集错误表结构 # 在ErrorLog表中,新建以新资产内指定服务器为对象,错误信息为新资产内的对应内容 if new_server_info['disk']['status'] != 10000: models.ErrorLog.objects.create(asset_obj=new_server_info.asset, content=new_server_info['disk']['data'], title="[%s]硬盘采集错误信息" % hostname) ''' new_server_info '0': {'slot': '0', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006 LS08S0K2B5NV'}, '1': {'slot': '1', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006 LS08S0K2B5AH'}, '2': {'slot': '2', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1SZNSAFA01085L Samsung SSD 850 PRO 512GB EXM01B6Q'}, ''' ''' old_disk_info [ Disk(slot, model), Disk(slot, model), ] ''' # 获取硬盘的新旧信息 old_disk_info = models.Disk.objects.filter(server_obj=old_server_obj) new_disk_info = new_server_info['disk']['data'] # new_slot_list [0,1,2,3,4,5] new_slot_list = list(new_disk_info.keys()) old_slot_list = [] for v in old_disk_info: old_slot_list.append(v.slot) ''' new_slot_list: [1,2,3] old_slot_list: [1,2,4] ''' # 硬盘信息的增加操作—————————————————————————————————— ''' 逻辑思路总结: 1- 针对于新旧硬盘信息的slot号,新增的数据即,新Slot-旧Slot的剩余Slot号 (集合相减求差集操作) 2- 获取新增的Slot号列表 3- 循环新增Slot列表,每次循环将其key值放入变更信息格式内,用于之后录入变更表 4- 将Slot列表内存入更新的硬盘对象(旧硬盘对象),并在数据库内进行创建操作 5- 对错误信息列表recoder_list内的值进行‘;’分割,并在数据库内进行创建操作 ''' add_slot_list = set(new_slot_list).difference(set(old_slot_list)) # print(add_slot_list) if add_slot_list: recoder_list = [] for v in add_slot_list: # {'slot': '0', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006 LS08S0K2B5NV'} disk_res = new_disk_info[v] tmp = "增加磁盘槽位{slot}, 类型{pd_type}, 容量{capacity}, 型号{model}".format(**disk_res) recoder_list.append(tmp) disk_res['server_obj'] = old_server_obj models.Disk.objects.create(**disk_res) recoder_str = ";".join(recoder_list) models.AssetRecord.objects.create(asset_obj=old_server_obj.asset, content=recoder_str) # 硬盘信息的删除操作—————————————————————————————————— ''' 逻辑思路总结: 1- 针对于新旧硬盘信息的slot号,删除的数据即,旧Slot-新Slot的剩余Slot号 (集合相减求差集操作) 2- 获取删除的Slot号列表 3- 更具Slot号列表直接对数据库内的符合信息(in操作),进行删除 4- 对错误信息列表recoder_list内的值进行‘;’分割,并在数据库内进行创建操作 ''' del_slot_list = set(old_slot_list).difference(set(new_slot_list)) # print(del_slot_list) if del_slot_list: models.Disk.objects.filter(slot__in=del_slot_list, server_obj=old_server_obj).delete() del_str = "删除的槽位是%s" % (";".join(del_slot_list)) models.AssetRecord.objects.create(asset_obj=old_server_obj.asset, content=del_str) # 硬盘信息的修改操作—————————————————————————————————— ''' 逻辑思路总结: 1- 针对于新旧硬盘信息的slot号,修改的数据即,新旧Slot号集合取交集(不变的数据) 2- 获取修改的Slot号列表 3- 循环修改Slot列表,根据Slot号从对应磁盘表内获取对象(旧磁盘信息),根据Slot号获取新获取数据内的磁盘信息 4- 循环新磁盘信息内数据,使用映射,从旧数据信息内获取循环的新数据对象(一定取的到,无需存在判断) 5- 若新旧数据不相等,表示为改动数据,获取其槽位以及变更的新旧信息拼接成字符串,用于之后的变更表记录创建 6- 将变更字符串存入列表(recoder_list),用于存入变更表 7- 使用映射setattr对旧磁盘信息对象(queryset)列表将新信息存入 8- 保存旧磁盘对象old_disk_row的更新(数据库对象的save更新) 9- 对记录变更表变更信息,用‘;’分割存入变更信息列表recoder_list ''' up_slot_list = set(old_slot_list).intersection(set(new_slot_list)) # print(up_slot_list) if up_slot_list: recoder_list = [] for slot in up_slot_list: old_disk_row = models.Disk.objects.filter(slot=slot, server_obj=old_server_obj).first() # [disk(slot)] # {'slot': '0', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006 LS08S0K2B5NV'} new_disk_row = new_disk_info[slot] for k, new_v in new_disk_row.items(): ''' k: slot, pd_type, model new_v: SAS ''' old_v = getattr(old_disk_row, k) if old_v != new_v: tmp = "槽位:%s, %s由%s更改为%s" % (slot, k, old_v, new_v) recoder_list.append(tmp) setattr(old_disk_row, k, new_v) old_disk_row.save() models.AssetRecord.objects.create(asset_obj=old_server_obj.asset, content=";".join(recoder_list)) return HttpResponse('ok')