Files
django-vue3-admin-gd/backend/system/views/dept.py
2025-06-30 17:33:47 +08:00

86 lines
3.0 KiB
Python

from datetime import timezone, datetime
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import status, serializers
from rest_framework.decorators import action
from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework.response import Response
from system.models import Dept
from utils.custom_model_viewSet import CustomModelViewSet
from utils.serializers import CustomModelSerializer
class DeptSerializer(CustomModelSerializer):
"""部门序列化器"""
children = serializers.SerializerMethodField()
status_text = serializers.SerializerMethodField()
class Meta:
model = Dept
fields = '__all__'
read_only_fields = ['id', 'create_time']
def get_children(self, obj):
"""获取子部门"""
children = obj.children.all().order_by('id')
if children:
return DeptSerializer(children, many=True).data
return []
def get_status_text(self, obj):
"""获取状态文本"""
return obj.get_status_display()
class DeptViewSet(CustomModelViewSet):
"""部门管理视图集"""
queryset = Dept.objects.filter(pid__isnull=True).order_by('id', 'status')
serializer_class = DeptSerializer
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = ['status', 'pid']
search_fields = ['name']
ordering_fields = ['create_time', 'name']
def perform_create(self, serializer):
# 自动设置创建时间
if 'create_time' not in serializer.validated_data:
serializer.validated_data['create_time'] = datetime.now()
serializer.save()
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
pk = kwargs['pk']
instance = Dept.objects.get(pk=pk)
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}
headers = self.get_success_headers(serializer.data)
return self._build_response(
data=serializer.data,
message="ok",
status=status.HTTP_200_OK,
)
def destroy(self, request, *args, **kwargs):
pk = kwargs['pk']
instance = Dept.objects.get(pk=pk)
self.perform_destroy(instance)
return self._build_response(
message="ok",
status=status.HTTP_200_OK,
)
@action(detail=False, methods=['get'])
def tree(self, request):
"""获取部门树形结构"""
queryset = self.get_queryset().filter(pid__isnull=True)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)