当前位置: 首页 > article >正文

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}")

相关文章:

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_yas…...

(十 三)趣学设计模式 之 模版方法模式!

目录 一、 啥是模板方法模式&#xff1f;二、 为什么要用模板方法模式&#xff1f;三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&a…...

泛型编程、函数模板、类模板

目录 一、泛型编程 1.泛型编程提出背景 1.1.代码复用案例解析 案例1&#xff1a;实现一个交换函数&#xff0c;并对不同类型参数进行函数重载 (1)调试 (2)代码解析 ①代码复用问题 ②泛型编程的解决方案 ③上面泛型Swap函数模版的优点 1.2.泛型编程提出背景 2.泛型编…...

【Vue3】浅谈setup语法糖

Vue3 的 setup 语法糖是通过 <script setup> 标签启用的特性&#xff0c;它是对 Composition API 的进一步封装&#xff0c;旨在简化组件的声明式写法&#xff0c;同时保留 Composition API 的逻辑组织能力。以下是其核心概念和原理分析&#xff1a; 一、<script setu…...

经验总结:使用vue3测试后端接口的模板

为了方便在开发中途&#xff0c;比较即时地&#xff0c;测试自己写的接口&#xff0c;是否有BUG&#xff0c;所以整理了这个测试模板。 效果就是可以通过自己编码&#xff0c;比较灵活&#xff0c;比较快得触发接口调用。 下边这个是最核心的模板&#xff0c;然后还有一个写axi…...

Vosk语音识别包

Vosk介绍 Vosk作为一款开源的离线语音识别工具包&#xff0c;其核心特点可归纳为以下五个方面&#xff0c;结合多篇技术文档的实践与分析 一、离线高效识别 完全脱离网络依赖&#xff1a;所有语音处理均在本地完成&#xff0c;无需云端数据传输&#xff0c;既保障隐私安全又…...

【欢迎来到Git世界】Github入门

241227 241227 241227 Hello World 参考&#xff1a;Hello World - GitHub 文档. 1.创建存储库 r e p o s i t o r y repository repository&#xff08;含README.md&#xff09; 仓库名需与用户名一致。 选择公共。 选择使用Readme初始化此仓库。 2.何时用分支&#xf…...

简洁的个人地址发布页HTML源码

源码介绍 简洁的个人地址发布页HTML源码,源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果 效果预览 源码获取 简洁的个人地址发布页HTML源码...

【VSCode】VSCode下载安装与配置极简描述

VSCode 参考网址&#xff1a;[Visual Studio Code Guide | GZTime’s Blog]. 下载安装 下载地址&#xff1a;Download Visual Studio Code - Mac, Linux, Windows. 注&#xff1a;推荐不更改安装位置&#xff0c;并且在附加任务中“其他”中的四项全部勾选&#xff0c;即将用…...

wav格式的音频压缩,WAV 转 MP3 VBR 体积缩减比为 13.5%、多个 MP3 格式音频合并为一个、文件夹存在则删除重建,不存在则直接建立

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 问题一&#xff1a;wav格式的音频压缩为哪些格式&#xff0c;网络传输给用户播放…...

Linux权限 -- 开发工具(一)

文章目录 包管理器yumyum具体操作 Linux编辑器 - vim的使用vimvim的多模式 包管理器yum Linux中安装软件&#xff1a; 1.源码安装 2. 软件包安装 – rpm 3. 包管理器yum(centos) apt/apt-get(ubuntu) 为什么有包管理器&#xff1f; 包管理器会自动帮我们解决包依赖的问题 2. 什…...

leetcode_动态规划/递归 279**. 完全平方数

279. 完全平方数 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 …...

【leetcode】二分查找专题

文章目录 1.二分查找1.题目2.解题思路3. 解题代码 2.在排序数组中查找元素的第一个和最后一个位置1.题目2.算法原理3. 代码 3.x的平方根1.题目2.代码 4.搜索插入位置1.题目2.解题思路3.解题代码 5.山脉数组的索引1.题目2.解题思路3. 代码 6.寻找峰值1.题目2.解题思路3.代码 7. …...

腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析

腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;对比分析 腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;作为当前文生图领域的两大代表模型&#xff0c;各自…...

《Python实战进阶》No 7: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战

第7集&#xff1a; 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战 在现代 Web 开发中&#xff0c;实时通信已经成为许多应用的核心需求。无论是聊天应用、股票行情推送&#xff0c;还是多人协作工具&#xff0c;WebSocket 都是实现高效实时通信的最佳选择之一。本…...

vector习题

完数和盈数 题目 完数VS盈数_牛客题霸_牛客网 一个数如果恰好等于它的各因子(该数本身除外)之和&#xff0c;如&#xff1a;6321。则称其为“完数”&#xff1b;若因子之和大于该数&#xff0c;则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述&#xff…...

unity学习59: 滑动条 和 滚动条 滚动区域

目录 1 滑动条 slider 1.1 创建slider 1.2 构成的子物体 1.2.1 找到 某个UI的 方法 1.3 构成的component&#xff0c;主体就是 slider 2 核心属性 2.1 value 2.2 direction 3 作用 3.1 由于是fill back 可以实现血条效果 3.2 可以取得 slider.value 数值 1 滑动条…...

基于vue框架的游戏博客网站设计iw282(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,博客信息,资源共享,游戏视频,游戏照片 开题报告内容 基于FlaskVue框架的游戏博客网站设计开题报告 一、项目背景与意义 随着互联网技术的飞速发展和游戏产业的不断壮大&#xff0c;游戏玩家对游戏资讯、攻略、评测等内容的需求日…...

UWB人员定位:精准、高效、安全的智能管理解决方案

在现代企业管理、工业生产、安全监测等领域&#xff0c;UWB&#xff08;超宽带&#xff09;人员定位系统正逐步成为高精度定位技术的首选。相较于传统的GPS、Wi-Fi、蓝牙等定位方式&#xff0c;UWB具备厘米级高精度、低延迟、高安全性、抗干扰强等突出优势&#xff0c;能够实现…...

etcd 3.15 三节点集群管理指南

本文档旨在提供 etcd 3.15 版本的三节点集群管理指南&#xff0c;涵盖节点的新增、删除、状态检查、数据库备份和恢复等操作。 1. 环境准备 1.1 系统要求 操作系统&#xff1a;Linux&#xff08;推荐 Ubuntu 18.04 或 CentOS 7&#xff09; 内存&#xff1a;至少 2GB 磁盘&a…...

在ubuntu 24.04.2 通过 Kubeadm 安装 Kubernetes v1.31.6

文章目录 1. 简介2. 准备3. 配置 containerd4. kubeadm 安装集群5. 安装网络 calico 插件 1. 简介 本指南介绍了如何在 Ubuntu 24.04.2 LTS 上安装和配置 Kubernetes 1.31.6 集群&#xff0c;包括容器运行时 containerd 的安装与配置&#xff0c;以及使用 kubeadm 进行集群初始…...

DO-254航空标准飞行器电机控制器设计注意事项

DO-254航空标准飞行器电机控制器设计注意事项 1.核心要求1.1 设计保证等级(DAL)划分1.2生命周期管理1.3验证与确认2.电机控制器硬件设计的关键注意事项2.1需求管理与可追溯性2.2冗余与容错设计2.3验证与确认策略2.4元器件选型与管理2.5环境适应性设计2.6文档与配置管理3.应用…...

【Pandas】pandas Series fillna

Pandas2.2 Series Computations descriptive stats 方法描述Series.backfill(*[, axis, inplace, limit, …])用于填充 Series 中缺失值&#xff08;NaN&#xff09;的方法Series.bfill(*[, axis, inplace, limit, …])用于填充 Series 中缺失值&#xff08;NaN&#xff09;的…...

文字描边实现内黄外绿效果

网页使用 <!DOCTYPE html> <html> <head> <style> .text-effect {color: #ffd700; /* 黄色文字 */-webkit-text-stroke: 2px #008000; /* 绿色描边&#xff08;兼容Webkit内核&#xff09; */text-stroke: 2px #008000; /* 标准语法 *…...

解决Deepseek“服务器繁忙,请稍后再试”问题,基于硅基流动和chatbox的解决方案

文章目录 前言操作步骤步骤1&#xff1a;注册账号步骤2&#xff1a;在线体验步骤3&#xff1a;获取API密钥步骤4&#xff1a;安装chatbox步骤5&#xff1a;chatbox设置 价格方面 前言 最近在使用DeepSeek时&#xff0c;开启深度思考功能后&#xff0c;频繁遇到“服务器繁忙&am…...

python-leetcode-使用最小花费爬楼梯

746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 解法 1&#xff1a;动态规划&#xff08;O(n) 时间&#xff0c;O(n) 空间&#xff09; class Solution:def minCostClimbingStairs(self, cost: List[int]) -> int:n len(cost)dp [0] * (n 1) # 额外多…...

图书数据采集:使用Python爬虫获取书籍详细信息

文章目录 一、准备工作1.1 环境搭建1.2 确定目标网站1.3 分析目标网站二、采集豆瓣读书网站三、处理动态加载的内容四、批量抓取多本书籍信息五、反爬虫策略与应对方法六、数据存储与管理七、总结在数字化时代,图书信息的管理和获取变得尤为重要。通过编写Python爬虫,可以从各…...

ChatGPT 提示词框架

作为一个资深安卓开发工程师&#xff0c;我们在日常开发中经常会用到 ChatGPT 来提升开发效率&#xff0c;比如代码优化、bug 排查、生成单元测试等。 但要想真正发挥 ChatGPT 的潜力&#xff0c;我们需要掌握一些提示词&#xff08;Prompt&#xff09;的编写技巧&#xff0c;并…...

【构建工具】Gradle 8中Android BuildConfig的变化与开启方法

随着Gradle 8的发布&#xff0c;Android开发者需要注意一个重要变化&#xff1a;BuildConfig类的生成现在默认被关闭了&#xff01;&#xff01;&#xff01;。这个变化可能会影响许多依赖于BuildConfig的项目&#xff08;别问&#xff0c;问就是我也被影响了&#xff0c;多好用…...

性能测试测试策略制定|知名软件测评机构经验分享

随着互联网产品的普及&#xff0c;产品面对的用户量级也越来越大&#xff0c;能抗住指数级增长的瞬间访问量以及交易量是保障购物体验是否顺畅的至关重要的一环&#xff0c;而我们的性能测试恰恰也是为此而存在的。 性能测试是什么呢&#xff1f;性能测试要怎么测呢&#xff1f…...