from rest_framework import generics from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.exceptions import PermissionDenied from .models import Dictionary from .serializers import DictionarySerializer class DictionaryListView(generics.ListCreateAPIView): """ 数据字典列表和创建视图 """ serializer_class = DictionarySerializer permission_classes = [IsAuthenticated] def get_queryset(self): """ 支持按类型过滤 """ queryset = Dictionary.objects.all() # 支持按类型过滤 dict_type = self.request.query_params.get('type') if dict_type: queryset = queryset.filter(type=dict_type) # 支持按名称搜索 name = self.request.query_params.get('name') if name: queryset = queryset.filter(name__icontains=name) return queryset def perform_create(self, serializer): # 只有管理员可以创建字典 if self.request.user.role != 'admin': raise PermissionDenied("只有管理员可以创建字典") serializer.save() class DictionaryDetailView(generics.RetrieveUpdateDestroyAPIView): """ 数据字典详情视图 """ queryset = Dictionary.objects.all() serializer_class = DictionarySerializer permission_classes = [IsAuthenticated] def perform_update(self, serializer): # 只有管理员可以更新字典 if self.request.user.role != 'admin': raise PermissionDenied("只有管理员可以更新字典") serializer.save() def perform_destroy(self, instance): # 只有管理员可以删除字典 if self.request.user.role != 'admin': raise PermissionDenied("只有管理员可以删除字典") instance.delete() @api_view(['GET']) @permission_classes([IsAuthenticated]) def dictionary_grouped(request): """ 获取分组的数据字典 """ dict_types = Dictionary.objects.values('type').distinct() result = [] for dict_type in dict_types: type_name = dict_type['type'] items = Dictionary.objects.filter(type=type_name) serializer = DictionarySerializer(items, many=True) result.append({ 'type': type_name, 'items': serializer.data }) return Response(result)