from rest_framework import viewsets
from .models import ListModel,DepartmentListModel,BoundTypeListModel,BoundBSListModel,BoundCodeTypeListModel,BoundStatusListModel,ProductListModel

from . import serializers
from utils.page import MyPageNumberPagination
from rest_framework.filters import OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.response import Response
from .filter import Filter,DepartmentFilter,BoundTypeFilter,BoundBSFilter,BoundCodeTypeFilter,BoundStatusFilter,ProductFilter
from rest_framework.exceptions import APIException


class APIViewSet(viewsets.ModelViewSet):

    pagination_class = MyPageNumberPagination
    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]
    filter_class = Filter

    def get_project(self):
        # 获取项目ID,如果不存在则返回None
        try:
            id = self.kwargs.get('pk')
            return id
        except:
            return None

    def get_queryset(self):
        # 根据请求用户过滤查询集
        id = self.get_project()
        if self.request.user:
            if id is None:
                return ListModel.objects.filter( is_delete=False)
            else:
                return ListModel.objects.filter( id=id, is_delete=False)
        else:
            return ListModel.objects.none()

    def get_serializer_class(self):
        # 根据操作类型选择合适的序列化器
        if self.action in ['list', 'retrieve', 'destroy']:
            return serializers.WarehouseGetSerializer
        elif self.action in ['create']:
            return serializers.WarehousePostSerializer
        elif self.action in ['update']:
            return serializers.WarehouseUpdateSerializer
        elif self.action in ['partial_update']:
            return serializers.WarehousePartialUpdateSerializer
        else:
            return self.http_method_not_allowed(request=self.request)

    def create(self, request, *args, **kwargs):
        # 创建一个数据行
        data = self.request.data
        data['openid'] = self.request.auth.openid
        if len(data['warehouse_name']) > 45:
            raise APIException({"detail": "The warehouse name is set to more than 45 characters"})
        if ListModel.objects.filter( warehouse_name=data['warehouse_name'],
                                    is_delete=False).exists():
            raise APIException({"detail": "Data Exists"})
        else:
            # if ListModel.objects.filter(openid=data['openid'], is_delete=False).count() >= 1:
            #     raise APIException({"detail": "You Just Can Add 1 Warehouse"})
            # else:
            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)    

    def update(self, request, pk):
        # 更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot update data which not yours"})
        else:
            data = self.request.data
            if len(data['warehouse_name']) > 45:
                raise APIException({"detail": "The warehouse name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def partial_update(self, request, pk):
        # 部分更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot partial_update data which not yours"})
        else:
            data = self.request.data
            if len(data['warehouse_name']) > 45:
                raise APIException({"detail": "The warehouse name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data, partial=True)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def destroy(self, request, pk):
        # 逻辑删除一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot delete data which not yours"})
        else:
            qs.is_delete = True
            qs.save()
            serializer = self.get_serializer(qs, many=False)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

class DepartmentAPIViewSet(viewsets.ModelViewSet):

    pagination_class = MyPageNumberPagination
    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]
    filter_class = DepartmentFilter

    def get_project(self):
        # 获取项目ID,如果不存在则返回None
        try:
            id = self.kwargs.get('pk')
            return id
        except:
            return None

    def get_queryset(self):
        # 根据请求用户过滤查询集
        id = self.get_project()
        if self.request.user:
            if id is None:
                return DepartmentListModel.objects.filter( is_delete=False)
            else:
                return DepartmentListModel.objects.filter( id=id, is_delete=False)
        else:
            return DepartmentListModel.objects.none()

    def get_serializer_class(self):
        # 根据操作类型选择合适的序列化器
        if self.action in ['list', 'retrieve', 'destroy']:
            return serializers.DepartmentGetSerializer
        elif self.action in ['create']:
            return serializers.DepartmentPostSerializer
        elif self.action in ['update']:
            return serializers.DepartmentUpdateSerializer
        elif self.action in ['partial_update']:
            return serializers.DepartmentPartialUpdateSerializer
        else:
            return self.http_method_not_allowed(request=self.request)

    def create(self, request, *args, **kwargs):
        # 创建一个数据行
        data = self.request.data
        data['openid'] = self.request.auth.openid
        if len(data['department_name']) > 45:
            raise APIException({"detail": "The department name is set to more than 45 characters"})
        if DepartmentListModel.objects.filter(department_name=data['department_name'],
                                             is_delete=False).exists():
            raise APIException({"detail": "Data Exists"})
        else:
            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def update(self, request, pk):
        # 更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot update data which not yours"})
        else:
            data = self.request.data
            if len(data['department_name']) > 45:
                raise APIException({"detail": "The department name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def partial_update(self, request, pk):
        # 部分更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot partial_update data which not yours"})
        else:
            data = self.request.data
            if len(data['department_name']) > 45:
                raise APIException({"detail": "The department name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data, partial=True)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def destroy(self, request, pk):
        # 逻辑删除一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot delete data which not yours"})
        else:
            qs.is_delete = True
            qs.save()
            serializer = self.get_serializer(qs, many=False)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

class BoundTypeAPIViewSet(viewsets.ModelViewSet):
    pagination_class = MyPageNumberPagination
    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]
    filter_class = BoundTypeFilter

    def get_project(self):
        # 获取项目ID,如果不存在则返回None
        try:
            id = self.kwargs.get('pk')
            return id
        except:
            return None

    def get_queryset(self):
        # 根据请求用户过滤查询集
        id = self.get_project()
        if self.request.user:
            if id is None:
                return BoundTypeListModel.objects.filter( is_delete=False)
            else:
                return BoundTypeListModel.objects.filter( id=id, is_delete=False)
        else:
            return BoundTypeListModel.objects.none()

    def get_serializer_class(self):
        # 根据操作类型选择合适的序列化器
        if self.action in ['list', 'retrieve', 'destroy']:
            return serializers.BoundTypeGetSerializer
        elif self.action in ['create']:
            return serializers.BoundTypePostSerializer
        elif self.action in ['update']:
            return serializers.BoundTypeUpdateSerializer
        elif self.action in ['partial_update']:
            return serializers.BoundTypePartialUpdateSerializer
        else:
            return self.http_method_not_allowed(request=self.request)

    def create(self, request, *args, **kwargs):
        # 创建一个数据行
        data = self.request.data    
        data['openid'] = self.request.auth.openid
        if len(data['bound_type_name']) > 45:
            raise APIException({"detail": "The bound type name is set to more than 45 characters"})
        if BoundTypeListModel.objects.filter(bound_type_name=data['bound_type_name'],
                                             is_delete=False).exists():
            raise APIException({"detail": "Data Exists"})
        else:
            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def update(self, request, pk):
        # 更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot update data which not yours"})
        else:
            data = self.request.data
            if len(data['bound_type_name']) > 45:
                raise APIException({"detail": "The bound type name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def partial_update(self, request, pk):
        # 部分更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot partial_update data which not yours"})
        else:
            data = self.request.data
            if len(data['bound_type_name']) > 45:
                raise APIException({"detail": "The bound type name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data, partial=True)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def destroy(self, request, pk):
        # 逻辑删除一个数据行
        qs = self.get_object()  
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot delete data which not yours"})
        else:
            qs.is_delete = True
            qs.save()
            serializer = self.get_serializer(qs, many=False)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)


    def update(self, request, pk):  
        # 更新一个数据行        
        qs = self.get_object()  
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot update data which not yours"})
        else:
            data = self.request.data            
            if len(data['bound_bs_name']) > 45:
                raise APIException({"detail": "The bound bs name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)        

    def partial_update(self, request, pk):
        # 部分更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot partial_update data which not yours"})
        else:
            data = self.request.data
            if len(data['bound_bs_name']) > 45:
                raise APIException({"detail": "The bound bs name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data, partial=True)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def destroy(self, request, pk):
        # 逻辑删除一个数据行
        qs = self.get_object()      
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot delete data which not yours"})    
        else:
            qs.is_delete = True
            qs.save()
            serializer = self.get_serializer(qs, many=False)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)


class BoundBusinessAPIViewSet(viewsets.ModelViewSet):
    pagination_class = MyPageNumberPagination
    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]
    filter_class = BoundBSFilter
    def get_project(self):
        # 获取项目ID,如果不存在则返回None
        try:
            id = self.kwargs.get('pk')
            return id
        except:
            return None

    def get_queryset(self):
        # 根据请求用户过滤查询集
        id = self.get_project()
        if self.request.user:
            if id is None:
                return BoundBSListModel.objects.filter( is_delete=False)
            else:
                return BoundBSListModel.objects.filter( id=id, is_delete=False)
        else:
            return BoundBSListModel.objects.none()
        
    def get_serializer_class(self):
        # 根据操作类型选择合适的序列化器
        if self.action in ['list', 'retrieve', 'destroy']:
            return serializers.BoundBSGetSerializer
        elif self.action in ['create']:
            return serializers.BoundBSPostSerializer
        elif self.action in ['update']:
            return serializers.BoundBSUpdateSerializer
        elif self.action in ['partial_update']:
            return serializers.BoundBSPartialUpdateSerializer
        else:
            return self.http_method_not_allowed(request=self.request)
    
    def create(self, request, *args, **kwargs):
        # 创建一个数据行
        data = self.request.data
        data['openid'] = self.request.auth.openid
        if len(data['bound_bs_name']) > 45:
            raise APIException({"detail": "The bound bs name is set to more than 45 characters"})
        if BoundBSListModel.objects.filter(bound_bs_name=data['bound_bs_name'],
                                           is_delete=False).exists():
            raise APIException({"detail": "Data Exists"})
        else:
            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)  
            return Response(serializer.data, status=200, headers=headers)        

    def update(self, request, pk):  
        # 更新一个数据行        
        qs = self.get_object()  
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot update data which not yours"})
        else:
            data = self.request.data            
            if len(data['bound_bs_name']) > 45:
                raise APIException({"detail": "The bound bs name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)        

    def partial_update(self, request, pk):
        # 部分更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot partial_update data which not yours"})
        else:
            data = self.request.data
            if len(data['bound_bs_name']) > 45:
                raise APIException({"detail": "The bound bs name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data, partial=True)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def destroy(self, request, pk):
        # 逻辑删除一个数据行
        qs = self.get_object()      
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot delete data which not yours"})    
        else:
            qs.is_delete = True
            qs.save()
            serializer = self.get_serializer(qs, many=False)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

class BoundCodeTypeAPIViewSet(viewsets.ModelViewSet):
    pagination_class = MyPageNumberPagination
    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]
    filter_class = BoundCodeTypeFilter

    def get_project(self):
        # 获取项目ID,如果不存在则返回None
        try:
            id = self.kwargs.get('pk')
            return id
        except:
            return None

    def get_queryset(self):
        # 根据请求用户过滤查询集
        id = self.get_project()
        if self.request.user:
            if id is None:
                return BoundCodeTypeListModel.objects.filter( is_delete=False)
            else:
                return BoundCodeTypeListModel.objects.filter( id=id, is_delete=False)
        else:
            return BoundCodeTypeListModel.objects.none()

    def get_serializer_class(self):
        # 根据操作类型选择合适的序列化器
        if self.action in ['list', 'retrieve', 'destroy']:
            return serializers.BoundCodeTypeGetSerializer
        elif self.action in ['create']:
            return serializers.BoundCodeTypePostSerializer
        elif self.action in ['update']:
            return serializers.BoundCodeTypeUpdateSerializer
        elif self.action in ['partial_update']:
            return serializers.BoundCodeTypePartialUpdateSerializer
        else:
            return self.http_method_not_allowed(request=self.request)

    def create(self, request, *args, **kwargs):
        # 创建一个数据行
        data = self.request.data
        data['openid'] = self.request.auth.openid
        if len(data['bound_code_type_name']) > 45:
            raise APIException({"detail": "The bound code type name is set to more than 45 characters"})
        if BoundCodeTypeListModel.objects.filter(bound_code_type_name=data['bound_code_type_name'],
                                             is_delete=False).exists():
            raise APIException({"detail": "Data Exists"})
        else:
            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def update(self, request, pk):
        # 更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot update data which not yours"})
        else:
            data = self.request.data
            if len(data['bound_code_type_name']) > 45:
                raise APIException({"detail": "The bound code type name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def partial_update(self, request, pk):
        # 部分更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot partial_update data which not yours"})
        else:
            data = self.request.data
            if len(data['bound_code_type_name']) > 45:
                raise APIException({"detail": "The bound code type name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data, partial=True)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def destroy(self, request, pk):
        # 逻辑删除一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot delete data which not yours"})
        else:
            qs.is_delete = True
            qs.save()
            serializer = self.get_serializer(qs, many=False)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)
class BoundStatusAPIViewSet(viewsets.ModelViewSet):
    pagination_class = MyPageNumberPagination
    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]
    filter_class = BoundStatusFilter

    def get_project(self):
        # 获取项目ID,如果不存在则返回None
        try:
            id = self.kwargs.get('pk')
            return id
        except:
            return None

    def get_queryset(self):
        # 根据请求用户过滤查询集
        id = self.get_project()
        if self.request.user:
            if id is None:
                return BoundStatusListModel.objects.filter( is_delete=False)
            else:
                return BoundStatusListModel.objects.filter( id=id, is_delete=False)
        else:
            return BoundStatusListModel.objects.none()

    def get_serializer_class(self):
        # 根据操作类型选择合适的序列化器
        if self.action in ['list', 'retrieve', 'destroy']:
            return serializers.BoundStatusGetSerializer
        elif self.action in ['create']:
            return serializers.BoundStatusPostSerializer
        elif self.action in ['update']:
            return serializers.BoundStatusUpdateSerializer
        elif self.action in ['partial_update']:
            return serializers.BoundStatusPartialUpdateSerializer
        else:
            return self.http_method_not_allowed(request=self.request)

    def create(self, request, *args, **kwargs):
        # 创建一个数据行
        data = self.request.data
        data['openid'] = self.request.auth.openid
        if len(data['bound_status_name']) > 45:
            raise APIException({"detail": "The bound status name is set to more than 45 characters"})
        if BoundStatusListModel.objects.filter(bound_status_name=data['bound_status_name'],
                                             is_delete=False).exists():
            raise APIException({"detail": "Data Exists"})
        else:
            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def update(self, request, pk):
        # 更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot update data which not yours"})
        else:
            data = self.request.data
            if len(data['bound_status_name']) > 45:
                raise APIException({"detail": "The bound status name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def partial_update(self, request, pk):
        # 部分更新一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot partial_update data which not yours"})
        else:
            data = self.request.data
            if len(data['bound_status_name']) > 45:
                raise APIException({"detail": "The bound status name is set to more than 45 characters"})
            serializer = self.get_serializer(qs, data=data, partial=True)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)

    def destroy(self, request, pk):
        # 逻辑删除一个数据行
        qs = self.get_object()
        if qs.openid != self.request.auth.openid:
            raise APIException({"detail": "Cannot delete data which not yours"})
        else:
            qs.is_delete = True
            qs.save()
            serializer = self.get_serializer(qs, many=False)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)



class MultipleViewSet(viewsets.ModelViewSet):

    authentication_classes = []
    pagination_class = MyPageNumberPagination
    permission_classes = []
    throttle_classes = []
    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['-id', ]
    filter_class = Filter

    def get_project(self):
        # 获取项目ID,如果不存在则返回None
        try:
            id = self.kwargs.get('pk')
            return id
        except:
            return None

    def get_queryset(self):
        # 根据请求用户过滤查询集
        id = self.get_project()
        if self.request.user:
            if id is None:
                return ListModel.objects.filter(is_delete=False)
            else:
                return ListModel.objects.filter(id=id, is_delete=False)
        else:
            return ListModel.objects.none()

    def get_serializer_class(self):
        # 根据操作类型选择合适的序列化器
        if self.action in ['list', 'retrieve']:
            return serializers.WarehouseGetSerializer
        else:
            return self.http_method_not_allowed(request=self.request)            
            
class ProductAPIViewSet(viewsets.ModelViewSet):
    pagination_class = MyPageNumberPagination
    filter_backends = [DjangoFilterBackend, OrderingFilter, ]
    ordering_fields = ['id', "create_time", "update_time", ]
    filter_class = ProductFilter

    def get_project(self):
        # 获取项目ID,如果不存在则返回None
        try:
            id = self.kwargs.get('pk')
            return id
        except:
            return None

    def get_queryset(self):
        # 根据请求用户过滤查询集
        id = self.get_project()
        if self.request.user:
            if id is None:
                return ProductListModel.objects.filter(is_delete=False)
            else:
                return ProductListModel.objects.filter(id=id, is_delete=False)
        else:
            return ProductListModel.objects.none()

    def get_serializer_class(self):
        # 根据操作类型选择合适的序列化器
        if self.action in ['list', 'retrieve', 'destroy']:
            return serializers.ProductGetSerializer
        elif self.action in ['create']:
            return serializers.ProductPostSerializer
        elif self.action in ['update']:
            return serializers.ProductUpdateSerializer
        elif self.action in ['partial_update']:
            return serializers.ProductPartialUpdateSerializer
        else:
            return self.http_method_not_allowed(request=self.request)

    def create(self, request, *args, **kwargs):
        # 创建一个数据行
        data = self.request.data

        if len(data['product_name']) > 45:
            raise APIException({"detail": "The product name is set to more than 45 characters"})
        if ProductListModel.objects.filter(product_code=data['product_code'],
                                             is_delete=False).exists():
            raise APIException({"detail": "Data Exists"})
        else:
            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=200, headers=headers)
    
    def update(self, request, pk):
        # 更新一个数据行
        qs = self.get_object()
       
        data = self.request.data
        if len(data['product_name']) > 45:
            raise APIException({"detail": "The product name is set to more than 45 characters"})
        if ProductListModel.objects.filter(product_code=data['product_code'],
                                            is_delete=False).exists():
            raise APIException({"detail": "Data Exists"})
        serializer = self.get_serializer(qs, data=data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=200, headers=headers)

    def partial_update(self, request, pk):
        # 部分更新一个数据行
        qs = self.get_object()
       
        data = self.request.data
        if len(data['product_name']) > 45:
            raise APIException({"detail": "The product name is set to more than 45 characters"})
        if ProductListModel.objects.filter(product_code=data['product_code'],
                                            is_delete=False).exists():
            raise APIException({"detail": "Data Exists"})
        serializer = self.get_serializer(qs, data=data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=200, headers=headers)

    def destroy(self, request, pk):
        # 逻辑删除一个数据行
        qs = self.get_object()

        qs.is_delete = True
        qs.save()
        serializer = self.get_serializer(qs, many=False)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=200, headers=headers)