Django - CMDB 项目学习 - 对Client传输的数据进行对数据库内数据的增删改操作(Server端数据处理)

目录

一、数据信息的处理 - 磁盘信息(可改进)


一、数据信息的处理 - 磁盘信息(可改进)

重点总结

  • new_slot_list = list(new_disk_info.keys()) - list的使用,获取字典的key值形成列表
    Django - CMDB 项目学习 - 对Client传输的数据进行对数据库内数据的增删改操作(Server端数据处理)
  • tmp = "增加磁盘槽位{slot}, 类型{pd_type}, 容量{capacity}, 型号{model}".format(**disk_res)
    • format + ** - 基于字典的批量录入
      Django - CMDB 项目学习 - 对Client传输的数据进行对数据库内数据的增删改操作(Server端数据处理)
  • recoder_str = ";".join(recoder_list) - 字符串的拼接
    Django - CMDB 项目学习 - 对Client传输的数据进行对数据库内数据的增删改操作(Server端数据处理)
  • 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')