wzl-django学习

####################################################总的urls.py

from django.contrib import admin
from django.urls import path,include, re_path
from django.views.static import serve
from django.conf import settings
from drf_yasg import openapi
from drf_yasg.views import get_schema_view
from rest_framework import permissions
from django.views.generic.base import RedirectView
from rest_framework_simplejwt.views import (
    TokenRefreshView,
)

from mysystem.views.login import LoginView,CaptchaView
from utils.swagger import CustomOpenAPISchemaGenerator

#前端接口view
from apps.logins.views import UsernamePassWordLoginView,APPMobilePasswordLoginView,SendSmsCodeView,APPMobileSMSLoginView,ForgetPasswdResetView,RegisterView
from apps.lyusers.views import SetUserNicknameView,ChangeAvatarView,uploadImagesView,DestroyUserView
from apps.lymessages.views import UserMessagesView,UserMessagesNoticeView,GetUnreadMessageNumView
from apps.platformsettings.views import *


#媒体文件流式响应
from utils.streamingmedia_response import streamingmedia_serve
#部署vue
from django.views.generic import TemplateView
#是否允许前端接口访问
from utils.middleware import OperateAllowFrontendView

schema_view = get_schema_view(
    openapi.Info(
        title="django-vue-lyadmin API",
        default_version='v1',
        # description="Test description",
        # terms_of_service="https://www.google.com/policies/terms/",
        # contact=openapi.Contact(email="contact@snippets.local"),
        # license=openapi.License(name="BSD License"),
    ),
    # public 如果为False,则只包含当前用户可以访问的端点。True返回全部
    public=True,
    permission_classes=(permissions.AllowAny,),# 可以允许任何人查看该接口
    # permission_classes=(permissions.IsAuthenticated) # 只允许通过认证的查看该接口
    generator_class=CustomOpenAPISchemaGenerator,
)

urlpatterns = [
    path('static/<path:path>', serve, {'document_root': settings.STATIC_ROOT},),  # 处理静态文件
    # path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT},),  # 处理媒体文件
    path('media/<path:path>', streamingmedia_serve, {'document_root': settings.MEDIA_ROOT}, ),  # 处理媒体文件

    #管理后台的标准接口
    path('api/system/', include('mysystem.urls')),
    path('api/monitor/', include('lymonitor.urls')),
    path('api/terminal/', include('lywebsocket.urls')),
    path('api/token/', LoginView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('api/captcha/', CaptchaView.as_view()),

    #管理后台其他自定义接口
    path('api/platformsettings/', include('apps.platformsettings.urls')),
    path('api/messages/', include('apps.lymessages.urls')),
    path('api/users/', include('apps.lyusers.urls')),
    path('api/crontab/', include('apps.lycrontab.urls')),
    path('api/wholeMachine/', include('apps.wholeMachine.urls')),


    #获取平台信息
    path('api/getsysconfig/', GetSystemConfigSettingsView.as_view(), name='前端用户获取平台其他设置'),
    path('api/getothersettings/', GetOtherManageDetailView.as_view(), name='前端用户获取平台其他设置'),
    path('api/getrotationimgs/', GetLunboManageListView.as_view(), name='前端用户获取平台轮播图设置'),


    #是否允许前端接口访问(临时操作,重启后无效)
    path('api/super/operate/', OperateAllowFrontendView.as_view(), name='超级管理员动态操作是否允许前端api接口访问'),

    #集成部署后端管理页面

    path('favicon.ico',RedirectView.as_view(url=r'static/favicon.ico')),
    path('', TemplateView.as_view(template_name="index.html"),name='后台管理默认页面'),
]

####################################################models.py

from django.db import models
from utils.models import CoreModel
from application import settings

# ================================================= #
# ************** 服务器分类 model  ************** #
# ================================================= #


class ServersUsage(CoreModel):
    """整机用途"""
    objects = None
    name = models.CharField(max_length=255, unique=True, verbose_name='名称')
    desc = models.CharField( max_length=255,null=True, blank=True,verbose_name='描述')
    sort = models.PositiveSmallIntegerField(default=0, verbose_name="排序", help_text="显示顺序")
    status = models.BooleanField(default=True, verbose_name="整机用途状态", help_text="整机用途状态")
    is_delete = models.BooleanField(default=False, verbose_name="是否逻辑删除", help_text="是否逻辑删除")
    class Meta:
        db_table = 'tb_servers_usage'
        verbose_name = '整机用途'
        verbose_name_plural = verbose_name
    def __str__(self):
        return self.name


class ServersModel(CoreModel):
    """整机机型"""
    objects = None
    name = models.CharField( max_length=255,unique=True, verbose_name='名称')
    area= models.CharField(max_length=255, null=True, verbose_name='设备领域')
    desc = models.CharField( max_length=255,null=True, blank=True,verbose_name='描述')
    sort = models.PositiveSmallIntegerField(default=0, verbose_name="排序", help_text="显示顺序")
    status = models.BooleanField(default=True, verbose_name="整机机型状态", help_text="整机机型状态")
    is_delete = models.BooleanField(default=False, verbose_name="是否逻辑删除", help_text="是否逻辑删除")

    class Meta:
        db_table = 'tb_servers_model'
        verbose_name = '整机机型'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

# # ================================================= #
# # ************** 跳板机信息 ************** #
# # ================================================= ##
class JumpServers(CoreModel):
    """跳板机信息"""
    jumpip = models.CharField(max_length=255, verbose_name="跳板机IP")
    jumpuser = models.CharField(max_length=255, verbose_name="跳板机user")
    jumppassword= models.CharField(max_length=255,verbose_name="跳板机password")


# ================================================= #
# ************** 整机信息 ************** #
# ================================================= #

class ServersInfo(CoreModel):
    """整机信息"""
    objects = None
    serverFrom  = models.CharField(max_length=255,blank=True, null=True, verbose_name="信息来源")  #
    serverCode  = models.CharField(max_length=255,blank=False, null=False, unique=True,verbose_name="设备编号")  #
    location = models.CharField(max_length=255, blank=False, null=False,  verbose_name="设备位置")
    hardware = models.CharField(max_length=255, blank=True, null=True, verbose_name="硬件配置")
    serversModel = models.ForeignKey(ServersModel, on_delete=models.PROTECT,blank=False, null=False,verbose_name='设备型号')
    serversUsage = models.ForeignKey(ServersUsage, on_delete=models.PROTECT, blank=False, null=False,verbose_name='设备用途')
    status = models.BooleanField(default=True, verbose_name="设备状态", help_text="设备状态")
    bmcIP = models.CharField(max_length=255, verbose_name="BMC地址")
    bmcUser = models.CharField(max_length=255, verbose_name="bmcuser",blank=True)
    bmcPassword= models.CharField(max_length=255, verbose_name="bmcpassword",blank=True)
    hostIP = models.CharField(max_length=255, verbose_name="host地址",blank=True)
    hostUser = models.CharField(max_length=255, verbose_name="hostUser", blank=True)
    hostPassword = models.CharField(max_length=255, verbose_name="hostPassword", blank=True)
    serialIP = models.CharField(max_length=255, verbose_name="串口地址", blank=True,null=True)
    serialPort= models.CharField(max_length=255, verbose_name="串口端口", blank=True,null=True)
    serialUser = models.CharField(max_length=255, verbose_name="串口User",  blank=True,null=True)
    serialPassword = models.CharField(max_length=255, verbose_name="串口Password",blank=True,null=True)
    toolingMachine = models.CharField(max_length=255, verbose_name="工装机", blank=True,null=True)
    borrowUser = models.CharField(max_length=255, null=True, blank=True,verbose_name="借用人")
    borrowFromtime= models.DateField(null=True, blank=True, verbose_name="借用时间")
    borrowEndtime= models.DateField(null=True, blank=True,  verbose_name="归还时间")
    borrowUse= models.CharField(max_length=255, verbose_name="借用用途", blank=True,null=True)
    notes = models.TextField( verbose_name="备注", blank=True,null=True)
    missingStatus = models.BooleanField( default=True, verbose_name="联通状态")
    recordStatus =models.BooleanField( default=False,verbose_name="备案不下电")
    jumpserver = models.ForeignKey(JumpServers, on_delete=models.SET_NULL,null=True,  verbose_name='跳板机')
    class Meta:
        db_table = 'tb_servers_info'
        verbose_name = '服务器信息'
        verbose_name_plural = verbose_name
    def __str__(self):
        return self.serverscode

class HostOffRecord(CoreModel):
    """下电记录"""
    servers = models.ForeignKey(ServersInfo, on_delete=models.PROTECT, verbose_name='整机')
    status = models.BooleanField( verbose_name="下电是否成功")
    class Meta:
        db_table = 'tb_servers_hostoffrecord'
        verbose_name = 'host下电记录'
        verbose_name_plural = verbose_name

class ServersUseRecord(CoreModel):
    """整机使用记录"""
    servers = models.ForeignKey(ServersInfo, on_delete=models.CASCADE, verbose_name='整机')
    borrowUser = models.CharField(max_length=255,verbose_name="借用人", blank=True)
    borrowFromtime= models.DateField(null=True, blank=True, verbose_name="借用时间")
    borrowEndtime= models.DateField(null=True, blank=True,  verbose_name="归还时间")
    class Meta:
        db_table = 'tb_servers_useRecord'
        verbose_name = '整机使用记录'
        verbose_name_plural = verbose_name

############views.py

import openpyxl
from django.db.models import Count, Q, Case, When, IntegerField, Value
from django.utils.timezone import now
from django_filters.rest_framework import DjangoFilterBackend
from apps.wholeMachine.models import ServersUsage, ServersModel, ServersInfo
from rest_framework import serializers
from apps.wholeMachine.mytools import is_valid_date
from utils.export_excel import export_excel
from utils.jsonResponse import SuccessResponse, ErrorResponse
from utils.serializers import CustomModelSerializer
from utils.viewset import CustomModelViewSet
class ServersUsageManageSerializer(CustomModelSerializer):
    """
    服务器用途-序列化器
    """
    class Meta:
        model = ServersUsage
        read_only_fields = ["id"]
        fields = '__all__'
class ServersUsageManageViewSet(CustomModelViewSet):
    """
    服务器用途 接口
    """
    queryset = ServersUsage.objects.all().order_by("sort")
    serializer_class = ServersUsageManageSerializer
    search_fields = ('name','status')
class ServersModelManageSerializer(CustomModelSerializer):
    """
    服务器机型-序列化器
    """
    class Meta:
        model = ServersModel
        read_only_fields = ["id"]
        fields = '__all__'

class ServersModelManageSerializer_UsageandModel(serializers.Serializer):
    serversUsage__name = serializers.CharField()
    serversUsage = serializers.CharField()
    serversModel__name= serializers.CharField()
    serversModel= serializers.CharField()
    serversCount = serializers.IntegerField()
    serversCount_dis = serializers.IntegerField()
class ServersModelManageViewSet(CustomModelViewSet):
    """
    服务器机型 接口
    """
    queryset = ServersModel.objects.all().order_by("sort")
    serializer_class = ServersModelManageSerializer
    search_fields = ('name',)
    filterset_fields = ('status','area',)
    def getArea(self,request,*args, **kwargs):
        queryset =  ServersModel.objects.values('area')
        return SuccessResponse(data=queryset, msg='success')

class ServersInfoManageSerializer(CustomModelSerializer):
    """
    整机信息-序列化器
    """
    serversmodel_area = serializers.SerializerMethodField(read_only=True)
    serversmodel_name = serializers.SerializerMethodField(read_only=True)
    serversusage_name = serializers.SerializerMethodField(read_only=True)
    def get_serversmodel_area(self,obj):
        if obj.serversModel :
            return obj.serversModel.area
    def get_serversmodel_name(self,obj):
        if obj.serversModel :
            return obj.serversModel.name
    def get_serversusage_name(self,obj):
        if obj.serversUsage :
            return obj.serversUsage.name
    class Meta:
        model = ServersInfo
        read_only_fields = ["id"]
        fields = '__all__'

class ExportServersInfoManageSerializer(CustomModelSerializer):
    """
    导出 整机信息 简单序列化器
    """
    serversmodel_area = serializers.SerializerMethodField(read_only=True)
    serversusage_name = serializers.SerializerMethodField(read_only=True)
    serversmodel_name = serializers.SerializerMethodField(read_only=True)
    def  get_serversmodel_area(self,obj):
        if obj.serversModel :
            return obj.serversModel.area
    def get_serversusage_name(self,obj):
        if obj.serversUsage :
            return obj.serversUsage.name
    def get_serversmodel_name(self,obj):
        if obj.serversModel :
            return obj.serversModel.name
    class Meta:
        model = ServersInfo
        fields = ('serverCode', 'location','serversmodel_area', 'serversusage_name','serversmodel_name','bmcip','bmcuser','bmcpassword','serialIP','serialPort')
# class ServersInfoCountSerializer_TypeandModel(serializers.Serializer):
#     serversModel__area = serializers.CharField()
#     serversModel__name= serializers.CharField()
#     serversModel= serializers.CharField()
#     serversCount = serializers.IntegerField()
#     serversCount_dis = serializers.IntegerField()
#     serversCount_nouse = serializers.IntegerField()


class ServersInfoManageViewSet(CustomModelViewSet):
    """
    整机信息 接口
    """
    queryset = ServersInfo.objects.filter(status=1).order_by("-create_datetime")
    # queryset = ServersInfo.objects.all().order_by("-create_datetime")
    serializer_class =  ServersInfoManageSerializer
    create_serializer_class =  ServersInfoManageSerializer
    update_serializer_class =ServersInfoManageSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = {
        'serverCode': ['icontains'],
        'serverFrom': ['icontains'],
        'hardware': ['icontains'],
        'borrowEndtime': ['lte'],
        'serversUsage': ['exact'],
        'serversModel': ['exact'],
        'serversModel__area': ['exact'],
    }
    search_fields = ('serverCode', 'serverFrom', 'hardware')
    def get_queryset(self):
        queryset = super().get_queryset()
        search_param = self.request.query_params.get('search', None)
        borrow_user_is_null = self.request.query_params.get('borrowUserIsNull', None)
        borrow_endtime_earlier_param = self.request.query_params.get('borrowEndtimeEarlierThan', None)
        borrow_endtime_later_param = self.request.query_params.get('borrowEndtimeLaterThan', None)
        if borrow_user_is_null is not None:
            borrow_user_is_null = borrow_user_is_null.lower()=='true'
            queryset = queryset.filter(borrowUser__isnull=borrow_user_is_null)
        if search_param:
            queryset = queryset.filter(
                Q(serverCode__icontains=search_param) |
                Q(serverFrom__icontains=search_param) |
                Q(hardware__icontains=search_param)|
                Q(bmcIP__icontains=search_param)
            )
        if borrow_endtime_earlier_param:
            queryset = queryset.filter(
                Q(borrowEndtime__lt=borrow_endtime_earlier_param) | Q(borrowEndtime__isnull=True)
            )
        if borrow_endtime_later_param:
            queryset = queryset.filter(
                Q(borrowEndtime__gte=borrow_endtime_later_param) | Q(borrowEndtime__isnull=True)
            )
        return queryset


    def countAll(self,request,*args, **kwargs):
        total_books = ServersInfo.objects.count()
        serversCount_dis = ServersInfo.objects.filter(missingStatus=0).count()
        data = {
            'total_books': total_books,
            'serversCount_dis':serversCount_dis,
        }
        return SuccessResponse(data=data, msg='success')

    def countbyAreaandModel(self,request,*args, **kwargs):
        current_date = now().date()
        queryset =  ServersInfo.objects.values('serversModel__area', 'serversModel__name','serversModel').annotate(
            serversCount=Count('id'),
            serversCount_dis=Count('id', filter=Q(missingStatus=0)),
            serversCount_nouse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
                         Q(borrowUser__isnull=True)),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            ),
            serversCount_inuse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True)) &
                        Q(borrowUser__isnull=False),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            )
        ).order_by('-serversCount')
        # serializer = ServersInfoCountSerializer_TypeandModel(queryset, many=True)
        return SuccessResponse(data=queryset, msg='success')
    def countbyArea(self,request,*args, **kwargs):
        current_date = now().date()
        queryset =  ServersInfo.objects.values('serversModel__area').annotate(
            serversCount=Count('id'),
            serversCount_dis = Count('id', filter=Q(missingStatus=0)),
            serversCount_nouse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
                         Q(borrowUser__isnull=True)),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            ),
            serversCount_inuse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True))&
                        Q(borrowUser__isnull=False),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            )
        ).order_by('-serversCount')
        return SuccessResponse(data=queryset, msg='success')

    def countbyUsageandModel(self,request,*args, **kwargs):
        current_date = now().date()
        queryset =  ServersInfo.objects.values('serversModel__name','serversUsage__name','serversModel','serversUsage').annotate(
            serversCount=Count('id'),
            serversCount_dis = Count('id', filter=Q(missingStatus=0)),
            serversCount_nouse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
                         Q(borrowUser__isnull=True)),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            ),
            serversCount_inuse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True)) &
                        Q(borrowUser__isnull=False),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            )

        ).order_by('-serversModel__name','-serversCount')
        # serializer = ServersInfoCountSerializer_UsageandModel(queryset, many=True)
        return SuccessResponse(data=queryset, msg='success')
    def countbyUsage(self,request,*args, **kwargs):
        current_date = now().date()
        queryset =  ServersInfo.objects.values('serversUsage__name','serversUsage').annotate(
            serversCount=Count('id'),
            serversCount_dis = Count('id', filter=Q(missingStatus=0)),
            serversCount_nouse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
                         Q(borrowUser__isnull=True)),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            ),
            serversCount_inuse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True))&
                        Q(borrowUser__isnull=False),
                        # queryset=queryset.filter(borrowUser__isnull=borrow_user_is_null)
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            )
        ).order_by('-serversCount')
        return SuccessResponse(data=queryset, msg='success')

    def exportexecl(self, request):
        field_data =  ['服务器编号', '服务器位置', '整机类别', '整机用途', '整机型号', 'BMCIP','bmcuser','bmcpassword','串口地址','串口端口']
        queryset = self.filter_queryset(self.get_queryset())
        data = ExportServersInfoManageSerializer(queryset, many=True).data
        return SuccessResponse(data=export_excel(request, field_data, data, '服务器数据.xls'), msg='success')

    def importexcel(self,request, *args, **kwargs):
        """
        导入execl中字段如果为数字会自动加.0 ,解决方法:execl设置该列为文本型
        """
        f = request.FILES.get('file')
        if not f:
            return ErrorResponse(msg="未找到上传的文件")
        excel_type = f.name.split('.')[1]
        if excel_type not in ['xlsx']:
            return ErrorResponse(msg="仅允许导入xlsx文件")
        workbook = openpyxl.load_workbook(filename=f,read_only=True)
        sheet = workbook.active
        data_import_list = []
        error_import_list = []
        rowsnum=1
        existing_server_codes = set(ServersInfo.objects.values_list('serverCode', flat=True))
        for rowvalue in sheet.iter_rows(min_row=2, values_only=True):
            rowsnum = rowsnum+1
            errordict={}
            errordict['rowsnum']= rowsnum
            serverCode = rowvalue[2]
            if serverCode is not None:
                # serverCode = serverCode.replace(' ', '')
                serverCode = serverCode.strip()
            else:
                errordict['serverCode'] = f'设备编号错误----{serverCode}'
                error_import_list.append(errordict)
                continue
            if serverCode in existing_server_codes:
                errordict['serverCode'] = f'serverCode 重复----{serverCode}'
                error_import_list.append(errordict)
                continue
            serversUsage =rowvalue[5]
            if serversUsage != None:
                serversUsage =rowvalue[5].replace(' ', '')
            else:
                errordict['serversUsage'] = f'设备用途错误----{serversUsage}'
                error_import_list.append(errordict)
                continue
            servers_Info_obj=False
            try:
                servers_Info_obj =  ServersInfo.objects.get(serverCode=serverCode)
            except :
                print('')
            if servers_Info_obj:
                errordict['serverCode'] = f'serverCode重复----{serverCode}'
                error_import_list.append(errordict)
                continue
            serversModel=''
            index = serverCode.find('-')
            print()
            if index != -1:
                serversModel=serverCode[:index]
            else:
                serversModel = serverCode
            try:
                servers_model_obj = ServersModel.objects.get(name=serversModel)
            except ServersModel.DoesNotExist as e:
                errordict['ServersModel']=f'设备机型不在机型列表中---{serversModel}'
                error_import_list.append(errordict)
                continue
            try:
                servers_Usage_obj =ServersUsage.objects.get(name=rowvalue[5])
            except ServersUsage.DoesNotExist as e:
                errordict['ServersUsage'] = f'设备用途不在用途列表中---{rowvalue[5]}'
                error_import_list.append(errordict)
                continue
            borrowFromtime = rowvalue[9]
            borrowEndtime = rowvalue[10]
            if borrowFromtime!=None:
                borrowFromtime=borrowFromtime.replace(' ', '').replace('\ufeff','')
                if borrowFromtime!=''and is_valid_date(borrowFromtime) == False:
                    errordict['borrowFromtime'] = f'borrowFromtime日期格式不对---{borrowFromtime}'
                    error_import_list.append(errordict)
                    continue
                if borrowFromtime == '':
                    borrowFromtime = None
            if borrowEndtime != None:
                borrowEndtime= borrowEndtime.replace(' ', '').replace('\ufeff','')
                if borrowEndtime!='' and is_valid_date(borrowEndtime) == False:
                    errordict['borrowEndtime'] = f'borrowEndtime日期格式不对---{borrowEndtime}'
                    error_import_list.append(errordict)
                    continue
                if borrowEndtime == '':
                    borrowEndtime = None
            borrowUser = rowvalue[8]
            if borrowUser != None:
                borrowUser=borrowUser.replace(' ', '').replace('\ufeff','')
                if len(borrowUser) > 130:
                    errordict['borrowUser'] = f'borrowUser数据错误---{borrowUser}'
                    error_import_list.append(errordict)
                    continue
                if borrowUser=='':
                    borrowUser = None

            try:
                data_dict = {
                    'serverFrom':rowvalue[1] ,
                    'serverCode':serverCode,
                    'serversModel':servers_model_obj ,
                    'location':rowvalue[3],
                    'hardware':rowvalue[4],
                    'serversUsage':servers_Usage_obj,
                    'bmcIP':rowvalue[6],
                    'hostIP':rowvalue[7],
                    'borrowUser':borrowUser,
                    'borrowFromtime':borrowFromtime,
                    'borrowEndtime':borrowEndtime,
                    'borrowUse':rowvalue[11],
                    'notes':rowvalue[12]
                }
                obj = ServersInfo(**data_dict)
                data_import_list.append(obj)
                existing_server_codes.add(serverCode)  # 将当前 serverCode 添加到已存在集合中
            except Exception as e:
                errordict['datachange'] = e
                error_import_list.append(errordict)
                continue
        lenObjects=len(data_import_list)
        lenOerror=len(error_import_list)
        ServersInfo.objects.bulk_create(data_import_list)
        return SuccessResponse(data= error_import_list, msg=f"导入{lenObjects}行,错误行数{lenOerror}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27616.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP 连接故障排查与 SYN 洪泛攻击防御

1 SYN 洪泛攻击防御 1.1 SYN Flood是什么&#xff1f; SYN Flood是互联网上最原始、最经典的DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务&#xff09;攻击之一&#xff0c;旨在耗尽可用服务器资源&#xff0c;致使服务器无法传输合法流量。 SYN…

ArcGIS Pro应用指南:如何为栅格图精确添加坐标信息

一、引言 在地理信息系统中&#xff0c;栅格图是一种重要的数据类型。 然而&#xff0c;有时我们从网络上获取的栅格图并不包含坐标信息&#xff0c;这使得它们难以与其他带有坐标信息的数据进行集成和分析。 为了解决这一问题&#xff0c;我们需要对栅格图进行地理配准&…

Spring Boot 与 MyBatis 版本兼容性

初接触Spring Boot&#xff0c;本次使用Spring Boot版本为3.4.3&#xff0c;mybatis的起步依赖版本为3.0.0&#xff0c;在启动时报错&#xff0c;报错代码如下 org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name userMapper…

CSS—text文本、font字体、列表list、表格table、表单input、下拉菜单select

目录 1.文本 2.字体 3.列表list a.无序列表 b.有序列表 c.定义列表 4.表格table a.内容 b.合并单元格 3.表单input a.input标签 b.单选框 c.上传文件 4.下拉菜单 1.文本 属性描述color设置文本颜色。direction指定文本的方向 / 书写方向。letter-spacing设置字符…

Linux之环境变量(超详细版)

前言:各位老铁们好&#xff0c;好久没分享知识了&#xff0c;今天我要和各位老铁分享的是环境变量 &#xff0c;对于Linux操作系统的学习者&#xff0c;我们会经常使用到环境变量&#xff0c;那么什么是环境变量呢&#xff1f;在讲环境变量之前&#xff0c;先问各位老铁一个问题…

【C语言】联合体 `union` 的妙用

C 语言联合体的妙用:结合 . 和 -> 操作符与 typedef 的深入剖析 在 C 语言中,联合体(union)是一种独特的复合数据类型,因其内存共享特性而在内存优化、类型切换和底层操作中展现出妙用。与结构体(struct)不同,联合体允许同一块内存存储不同类型的数据,提供高效且灵…

macOS - 使用 tmux

文章目录 安装 tmux使用更多快捷键说明 安装 tmux brew install tmux使用 在终端输入 tmux 进入 tmux 界面&#xff0c;然后 输入 Control Option B 进入交互模式 输入 % 左右分栏&#xff0c;" 上下分割 上一个窗格&#xff1a;{&#xff0c;下一个&#xff1a;} PS…

构建私有化AI知识库:基于CentOS的Ollama + DeepSeek-R1 +ragflow 整合部署教程

操作系统&#xff1a;CentOS 7.9 CPU&#xff1a;支持 AVX 指令集的 x86_64 处理器 内存&#xff1a;64GB 存储&#xff1a;SSD 1TB 以上 GPU&#xff08;可选&#xff09; 一、组件介绍 Ollama Ollama 是一个专为在本地机器上部署和运行大型语言模型&#xff08;LLM&a…

Goby 漏洞安全通告| Ollama /api/tags 未授权访问漏洞(CNVD-2025-04094)

漏洞名称&#xff1a;Ollama /api/tags 未授权访问漏洞&#xff08;CNVD-2025-04094&#xff09; English Name&#xff1a;Ollama /api/tags Unauthorized Access Vulnerability (CNVD-2025-04094) CVSS core: 6.5 风险等级&#xff1a; 中风险 漏洞描述&#xff1a; O…

Linux命令超级汇总

文件和目录操作 命令语法常用选项及说明lsls [选项] [目录名]- -l&#xff1a;以长格式显示文件和目录信息 - -a&#xff1a;显示所有文件&#xff0c;包括隐藏文件 - -h&#xff1a;与 -l 配合&#xff0c;以人类可读的方式显示文件大小 - -R&#xff1a;递归显示子目录内容cd…

Python 爬取唐诗宋词三百首

你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例&#xff0c;它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…

14. LangChain项目实战1——基于公司制度RAG回答机器人

教学视频&#xff1a; 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置&#xff1a; python版本&#xff1a;3.10.8 服务器&#xff1a;Ubuntu 依赖包requirements.txt文件内容&#xff1a; aiofiles23.2.1 …

香港首个人工智能大模型HKGAI V1发布:粤语AI时代正式开启

2月25日&#xff0c;香港科技创新领域迎来了一项里程碑式的成就——由香港特区政府重点创科项目“InnoHK 创新香港研发平台”慷慨资助的香港生成式人工智能研发中心(HKGAI)正式揭晓了其倾力打造的HKGAI V1大模型。这一创举不仅标志着香港在人工智能发展道路上迈出了坚实的一步&…

简易的微信聊天网页版【项目测试报告】

文章目录 一、项目背景二、项目简介登录功能好友列表页面好友会话页面 三、测试工具和环境四、测试计划测试用例部分人工手动测试截图web自动化测试测试用例代码框架配置内容代码文件&#xff08;Utils.py&#xff09;登录页面代码文件&#xff08;WeChatLogin.py&#xff09;好…

QT播放视频保持视频宽高比消除黑边

QT播放视频保持视频宽高比消除黑边 1、问题 在播放视频的时候&#xff0c;由于框架的大小发生变化&#xff0c;导致视频出现黑边很不好看。 因此需要像一种方法消除黑边 2、处理 1、读取视频的宽高比 2、设置视频的Widget的大小固定&#xff0c;Widget的宽高比和视频宽高比…

Apache nifi demo 实验

Apache nifi 是个数据流系统&#xff0c;可以通过配置 自定义的流程来实现数据的转换。 比如可以配置一个流程&#xff0c;读取数据库里的数据&#xff0c;再转换&#xff0c;最后保存到本地文件。 这样可以来实现一些数据转换的操作&#xff0c;而不用特地编写程序来导入导出。…

蓝桥杯 - 每日打卡(类斐波那契循环数)

题目: 解题思路&#xff1a; 假设输入数值为number 分析题目&#xff0c;如果想要解决这个问题&#xff0c;我们需要实现两个方法&#xff0c;第一个检查number是否是类斐波那契&#xff0c;第二个是模拟1e7 - 0的过程&#xff0c;因为是求最大的&#xff0c;那么我们从1e7开始…

DeepSeek集成到VScode工具,让编程更高效

DeepSeek与VScode的强强联合&#xff0c;为编程效率树立了新标杆。 DeepSeek&#xff0c;一款卓越的代码搜索引擎&#xff0c;以其精准的索引和高速的检索能力&#xff0c;助力开发者在浩瀚的代码海洋中迅速定位关键信息。 集成至VScode后&#xff0c;开发者无需离开熟悉的编辑…

RAG组件:向量数据库(Milvus)

在当前大模型盛行的时代&#xff0c;大模型的垂类微调、优化成为产业落地、行业应用的关键&#xff1b;RAG技术应运而生&#xff0c;主要解决大模型对专业知识、实效性知识欠缺的问题&#xff1b; RAG的核心工作逻辑是将专业知识、实效知识等大模型欠缺的知识进行收集、打包、保…

2022java面试总结,1000道(集合+JVM+并发编程+Spring+Mybatis)的Java高频面试题

1、面试题模块汇总 面试题包括以下十九个模块&#xff1a; Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示…