diff --git a/backend/apps/material/views.py b/backend/apps/material/views.py index b35ccba..6149457 100644 --- a/backend/apps/material/views.py +++ b/backend/apps/material/views.py @@ -7,6 +7,7 @@ from openpyxl import Workbook from openpyxl.worksheet.datavalidation import DataValidation from openpyxl.styles import Alignment, Border, Font, PatternFill, Side from openpyxl.utils import get_column_letter +from django.db.models import Count from rest_framework import generics, status from rest_framework.decorators import api_view, action from rest_framework.permissions import IsAuthenticated @@ -483,6 +484,37 @@ class MaterialViewSet(ModelViewSet): return Response(result) + @action(detail=False, methods=['get'], url_path='categories-by-major') + def categories_by_major(self, request): + major = request.query_params.get('major_category') + if not major: + return Response({"detail": "major_category 参数必填"}, status=status.HTTP_400_BAD_REQUEST) + qs = (Material.objects + .filter(major_category=major, status='approved') + .exclude(material_category__isnull=True) + .exclude(material_category__exact='') + .values('material_category') + .annotate(count=Count('id')) + .order_by('material_category')) + data = [{"value": row['material_category'], "count": row['count']} for row in qs] + return Response(data) + + @action(detail=False, methods=['get'], url_path='subcategories-by-category') + def subcategories_by_category(self, request): + major = request.query_params.get('major_category') + category = request.query_params.get('material_category') + if not major or not category: + return Response({"detail": "major_category 和 material_category 均必填"}, status=status.HTTP_400_BAD_REQUEST) + qs = (Material.objects + .filter(major_category=major, material_category=category, status='approved') + .exclude(material_subcategory__isnull=True) + .exclude(material_subcategory__exact='') + .values('material_subcategory') + .annotate(count=Count('id')) + .order_by('material_subcategory')) + data = [{"value": row['material_subcategory'], "count": row['count']} for row in qs] + return Response(data) + class MaterialCategoryViewSet(ModelViewSet): """