diff --git a/apps/brands/migrations/0002_alter_campaign_dataset_id_alter_product_dataset_id.py b/apps/brands/migrations/0002_alter_campaign_dataset_id_alter_product_dataset_id.py new file mode 100644 index 0000000..9299d77 --- /dev/null +++ b/apps/brands/migrations/0002_alter_campaign_dataset_id_alter_product_dataset_id.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.1 on 2025-05-30 02:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('brands', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='campaign', + name='dataset_id', + field=models.CharField(blank=True, help_text='外部知识库系统中的ID', max_length=100, null=True, verbose_name='知识库ID'), + ), + migrations.AlterField( + model_name='product', + name='dataset_id', + field=models.CharField(blank=True, help_text='外部知识库系统中的ID', max_length=100, null=True, verbose_name='知识库ID'), + ), + ] diff --git a/apps/brands/models.py b/apps/brands/models.py index 97c4460..c3e20b6 100644 --- a/apps/brands/models.py +++ b/apps/brands/models.py @@ -56,7 +56,7 @@ class Product(models.Model): collab_creators = models.IntegerField(default=0, verbose_name='合作创作者数') tiktok_shop = models.BooleanField(default=False, verbose_name='是否TikTok商店') - dataset_id = models.CharField(max_length=100, verbose_name='知识库ID', + dataset_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='知识库ID', help_text='外部知识库系统中的ID') external_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='外部ID', help_text='外部系统中的唯一标识') @@ -116,7 +116,7 @@ class Campaign(models.Model): end_date = models.DateTimeField(blank=True, null=True, verbose_name='结束日期') # 知识库信息 - dataset_id = models.CharField(max_length=100, verbose_name='知识库ID', + dataset_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='知识库ID', help_text='外部知识库系统中的ID') external_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='外部ID', help_text='外部系统中的唯一标识') diff --git a/apps/brands/views.py b/apps/brands/views.py index 51e4345..90803e8 100644 --- a/apps/brands/views.py +++ b/apps/brands/views.py @@ -42,7 +42,16 @@ class BrandViewSet(viewsets.ModelViewSet): return BrandSerializer def create(self, request, *args, **kwargs): - serializer = self.get_serializer(data=request.data) + data = request.data.copy() + + # 处理source字段,将前端的value值转换为后端存储 + if 'source' in data and data['source']: + # 前端可能传递的是对象或直接是值 + if isinstance(data['source'], dict) and 'value' in data['source']: + data['source'] = data['source']['value'] + # 否则认为直接传递的是值 + + serializer = self.get_serializer(data=data) if serializer.is_valid(): self.perform_create(serializer) headers = self.get_success_headers(serializer.data) @@ -62,7 +71,17 @@ class BrandViewSet(viewsets.ModelViewSet): def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) instance = self.get_object() - serializer = self.get_serializer(instance, data=request.data, partial=partial) + + data = request.data.copy() + + # 处理source字段,将前端的value值转换为后端存储 + if 'source' in data and data['source']: + # 前端可能传递的是对象或直接是值 + if isinstance(data['source'], dict) and 'value' in data['source']: + data['source'] = data['source']['value'] + # 否则认为直接传递的是值 + + serializer = self.get_serializer(instance, data=data, partial=partial) if serializer.is_valid(): self.perform_update(serializer) return api_response(data=serializer.data) @@ -112,6 +131,29 @@ class BrandViewSet(viewsets.ModelViewSet): serializer = self.get_serializer(queryset, many=True) return api_response(data=serializer.data) + @action(detail=False, methods=['get']) + def source_options(self, request): + """获取品牌来源选项列表""" + source_options = [ + { + 'value': 'tks_official', + 'name': 'TKS Official', + }, + { + 'value': 'third_party_agency', + 'name': 'Third-party Agency', + }, + { + 'value': 'offline_event', + 'name': 'Offline Event', + }, + { + 'value': 'social_media', + 'name': 'Social Media', + }, + ] + return api_response(data=source_options) + class ProductViewSet(viewsets.ModelViewSet): """产品API视图集""" @@ -172,7 +214,7 @@ class ProductViewSet(viewsets.ModelViewSet): brand = product.brand # 从品牌的dataset_id_list中移除旧的dataset_id,添加新的dataset_id - if old_dataset_id in brand.dataset_id_list: + if old_dataset_id and old_dataset_id in brand.dataset_id_list: brand.dataset_id_list.remove(old_dataset_id) if product.dataset_id and product.dataset_id not in brand.dataset_id_list: @@ -267,7 +309,39 @@ class CampaignViewSet(viewsets.ModelViewSet): return api_response(data=serializer.data) def create(self, request, *args, **kwargs): - serializer = self.get_serializer(data=request.data) + data = request.data.copy() + + # 处理budget字段,将[min, max]数组转为字符串格式 + if 'budget' in data and isinstance(data['budget'], list) and len(data['budget']) == 2: + data['budget'] = f"{data['budget'][0]}-{data['budget'][1]}" + + # 处理followers字段,将[min, max]数组转为字符串格式 + if 'followers' in data and isinstance(data['followers'], list) and len(data['followers']) == 2: + data['followers'] = f"{data['followers'][0]}-{data['followers'][1]}" + + # 处理views字段,将[min, max]数组转为字符串格式 + if 'views' in data and isinstance(data['views'], list) and len(data['views']) == 2: + data['views'] = f"{data['views'][0]}-{data['views'][1]}" + + # 处理品牌ID字段,从brand_id转为brand + if 'brand_id' in data and data['brand_id']: + data['brand'] = data.pop('brand_id') + + # 将creator_count转换为creators_count + if 'creator_count' in data: + data['creators_count'] = data.pop('creator_count') + + # 处理service字段,将前端的对象转换为值 + if 'service' in data and data['service']: + if isinstance(data['service'], dict) and 'value' in data['service']: + data['service'] = data['service']['value'] + + # 处理creator_type字段,将前端的对象转换为值 + if 'creator_type' in data and data['creator_type']: + if isinstance(data['creator_type'], dict) and 'value' in data['creator_type']: + data['creator_type'] = data['creator_type']['value'] + + serializer = self.get_serializer(data=data) if serializer.is_valid(): self.perform_create(serializer) headers = self.get_success_headers(serializer.data) @@ -282,7 +356,40 @@ class CampaignViewSet(viewsets.ModelViewSet): def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) instance = self.get_object() - serializer = self.get_serializer(instance, data=request.data, partial=partial) + + data = request.data.copy() + + # 处理budget字段,将[min, max]数组转为字符串格式 + if 'budget' in data and isinstance(data['budget'], list) and len(data['budget']) == 2: + data['budget'] = f"{data['budget'][0]}-{data['budget'][1]}" + + # 处理followers字段,将[min, max]数组转为字符串格式 + if 'followers' in data and isinstance(data['followers'], list) and len(data['followers']) == 2: + data['followers'] = f"{data['followers'][0]}-{data['followers'][1]}" + + # 处理views字段,将[min, max]数组转为字符串格式 + if 'views' in data and isinstance(data['views'], list) and len(data['views']) == 2: + data['views'] = f"{data['views'][0]}-{data['views'][1]}" + + # 处理品牌ID字段,从brand_id转为brand + if 'brand_id' in data and data['brand_id']: + data['brand'] = data.pop('brand_id') + + # 将creator_count转换为creators_count + if 'creator_count' in data: + data['creators_count'] = data.pop('creator_count') + + # 处理service字段,将前端的对象转换为值 + if 'service' in data and data['service']: + if isinstance(data['service'], dict) and 'value' in data['service']: + data['service'] = data['service']['value'] + + # 处理creator_type字段,将前端的对象转换为值 + if 'creator_type' in data and data['creator_type']: + if isinstance(data['creator_type'], dict) and 'value' in data['creator_type']: + data['creator_type'] = data['creator_type']['value'] + + serializer = self.get_serializer(instance, data=data, partial=partial) if serializer.is_valid(): self.perform_update(serializer) return api_response(data=serializer.data) @@ -294,11 +401,27 @@ class CampaignViewSet(viewsets.ModelViewSet): return api_response(message="删除成功", data=None) def perform_create(self, serializer): - # 创建活动时自动更新品牌的dataset_id_list + # 保存获取link_product字段,以便后续添加产品关联 + link_product_ids = self.request.data.get('link_product', []) + if isinstance(link_product_ids, str): + link_product_ids = [link_product_ids] + + # 创建活动 campaign = serializer.save() - brand = campaign.brand - # 确保dataset_id添加到品牌的dataset_id_list中 + # 处理产品关联 + if link_product_ids: + for product_id in link_product_ids: + try: + product = Product.objects.get(id=product_id) + campaign.link_product.add(product) + except Product.DoesNotExist: + logger.warning(f"产品ID {product_id} 不存在") + except Exception as e: + logger.error(f"添加产品关联时出错: {str(e)}") + + # 更新品牌的dataset_id_list + brand = campaign.brand if campaign.dataset_id and campaign.dataset_id not in brand.dataset_id_list: brand.dataset_id_list.append(campaign.dataset_id) brand.save(update_fields=['dataset_id_list', 'updated_at']) @@ -313,7 +436,7 @@ class CampaignViewSet(viewsets.ModelViewSet): brand = campaign.brand # 从品牌的dataset_id_list中移除旧的dataset_id,添加新的dataset_id - if old_dataset_id in brand.dataset_id_list: + if old_dataset_id and old_dataset_id in brand.dataset_id_list: brand.dataset_id_list.remove(old_dataset_id) if campaign.dataset_id and campaign.dataset_id not in brand.dataset_id_list: @@ -793,6 +916,48 @@ class CampaignViewSet(viewsets.ModelViewSet): serializer = self.get_serializer(queryset, many=True) return api_response(data=serializer.data) + @action(detail=False, methods=['get']) + def service_options(self, request): + """获取活动服务类型选项列表""" + service_options = [ + { + 'value': 'short_video_paid', + 'name': '达人短视频(付费)', + }, + { + 'value': 'short_video_affiliate', + 'name': '达人短视频(纯佣)', + }, + { + 'value': 'live_stream_brand_hosted', + 'name': '直播(代播)', + }, + { + 'value': 'live_stream_influencer_hosted', + 'name': '直播(达播)', + }, + { + 'value': 'short_video_material_only', + 'name': '纯素材短视频', + }, + ] + return api_response(data=service_options) + + @action(detail=False, methods=['get']) + def creator_type_options(self, request): + """获取创作者类型选项列表""" + creator_type_options = [ + { + 'value': 'product_promotion', + 'name': '带货类达人', + }, + { + 'value': 'exposure_focused', + 'name': '曝光类达人', + }, + ] + return api_response(data=creator_type_options) + class BrandChatSessionViewSet(viewsets.ModelViewSet): """品牌聊天会话API视图集""" diff --git a/apps/template/filters.py b/apps/template/filters.py index 982d28f..79513a8 100644 --- a/apps/template/filters.py +++ b/apps/template/filters.py @@ -9,8 +9,6 @@ class TemplateFilter(django_filters.FilterSet): platform = django_filters.CharFilter(field_name='platform') collaboration_type = django_filters.CharFilter(field_name='collaboration_type') service = django_filters.CharFilter(field_name='service') - category = django_filters.NumberFilter(field_name='category__id') - category_name = django_filters.CharFilter(field_name='category__name', lookup_expr='icontains') created_by = django_filters.NumberFilter(field_name='created_by__id') is_public = django_filters.BooleanFilter(field_name='is_public') created_after = django_filters.DateTimeFilter(field_name='created_at', lookup_expr='gte') @@ -20,7 +18,7 @@ class TemplateFilter(django_filters.FilterSet): model = Template fields = [ 'title', 'content', 'mission', 'platform', - 'collaboration_type', 'service', 'category', - 'category_name', 'created_by', 'is_public', + 'collaboration_type', 'service', + 'created_by', 'is_public', 'created_after', 'created_before' ] \ No newline at end of file diff --git a/apps/template/migrations/0002_remove_template_category_alter_template_mission_and_more.py b/apps/template/migrations/0002_remove_template_category_alter_template_mission_and_more.py new file mode 100644 index 0000000..e86c677 --- /dev/null +++ b/apps/template/migrations/0002_remove_template_category_alter_template_mission_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 5.2.1 on 2025-05-30 03:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('template', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='template', + name='category', + ), + migrations.AlterField( + model_name='template', + name='mission', + field=models.CharField(choices=[('all', '全部'), ('initial_contact', '初步建联'), ('negotiation', '砍价邮件'), ('script', '脚本邮件'), ('follow_up', '合作追踪')], default='initial_contact', max_length=50, verbose_name='任务类型'), + ), + migrations.DeleteModel( + name='TemplateCategory', + ), + ] diff --git a/apps/template/models.py b/apps/template/models.py index b390bf9..f9b4489 100644 --- a/apps/template/models.py +++ b/apps/template/models.py @@ -1,28 +1,14 @@ from django.db import models from django.utils.translation import gettext_lazy as _ -class TemplateCategory(models.Model): - """模板分类模型""" - name = models.CharField(_('分类名称'), max_length=100) - description = models.TextField(_('分类描述'), blank=True, null=True) - created_at = models.DateTimeField(_('创建时间'), auto_now_add=True) - updated_at = models.DateTimeField(_('更新时间'), auto_now=True) - - class Meta: - verbose_name = _('模板分类') - verbose_name_plural = _('模板分类') - - def __str__(self): - return self.name - class Template(models.Model): """模板模型""" MISSION_CHOICES = [ - ('initial_contact', '初步联系'), - ('follow_up', '跟进'), - ('negotiation', '谈判'), - ('closing', '成交'), - ('other', '其他'), + ('all', '全部'), + ('initial_contact', '初步建联'), + ('negotiation', '砍价邮件'), + ('script', '脚本邮件'), + ('follow_up', '合作追踪'), ] PLATFORM_CHOICES = [ @@ -53,7 +39,6 @@ class Template(models.Model): title = models.CharField(_('模板标题'), max_length=200) content = models.TextField(_('模板内容')) preview = models.TextField(_('内容预览'), blank=True, null=True) - category = models.ForeignKey(TemplateCategory, on_delete=models.CASCADE, related_name='templates', verbose_name=_('模板分类')) mission = models.CharField(_('任务类型'), max_length=50, choices=MISSION_CHOICES, default='initial_contact') platform = models.CharField(_('平台'), max_length=50, choices=PLATFORM_CHOICES, default='tiktok') collaboration_type = models.CharField(_('合作模式'), max_length=50, choices=COLLABORATION_CHOICES, default='paid_promotion') diff --git a/apps/template/serializers.py b/apps/template/serializers.py index a43fc27..e989ce2 100644 --- a/apps/template/serializers.py +++ b/apps/template/serializers.py @@ -1,16 +1,8 @@ from rest_framework import serializers -from .models import Template, TemplateCategory - -class TemplateCategorySerializer(serializers.ModelSerializer): - """模板分类序列化器""" - class Meta: - model = TemplateCategory - fields = ['id', 'name', 'description', 'created_at', 'updated_at'] - read_only_fields = ['created_at', 'updated_at'] +from .models import Template class TemplateListSerializer(serializers.ModelSerializer): """模板列表序列化器(简化版)""" - category_name = serializers.CharField(source='category.name', read_only=True) mission_display = serializers.CharField(source='get_mission_display', read_only=True) platform_display = serializers.CharField(source='get_platform_display', read_only=True) collaboration_type_display = serializers.CharField(source='get_collaboration_type_display', read_only=True) @@ -19,7 +11,7 @@ class TemplateListSerializer(serializers.ModelSerializer): class Meta: model = Template fields = [ - 'id', 'title', 'preview', 'category_name', + 'id', 'title', 'preview', 'mission', 'mission_display', 'platform', 'platform_display', 'service', 'service_display', @@ -30,8 +22,6 @@ class TemplateListSerializer(serializers.ModelSerializer): class TemplateDetailSerializer(serializers.ModelSerializer): """模板详情序列化器""" - category = TemplateCategorySerializer(read_only=True) - category_id = serializers.IntegerField(write_only=True, required=False) mission_display = serializers.CharField(source='get_mission_display', read_only=True) platform_display = serializers.CharField(source='get_platform_display', read_only=True) collaboration_type_display = serializers.CharField(source='get_collaboration_type_display', read_only=True) @@ -40,8 +30,7 @@ class TemplateDetailSerializer(serializers.ModelSerializer): class Meta: model = Template fields = [ - 'id', 'title', 'content', 'preview', - 'category', 'category_id', + 'id', 'title', 'content', 'preview', 'mission', 'mission_display', 'platform', 'platform_display', 'service', 'service_display', @@ -49,29 +38,14 @@ class TemplateDetailSerializer(serializers.ModelSerializer): 'is_public', 'created_at', 'updated_at' ] read_only_fields = ['created_at', 'updated_at', 'preview'] - - def create(self, validated_data): - """创建模板""" - # 处理category_id字段 - category_id = validated_data.pop('category_id', None) - if category_id: - try: - category = TemplateCategory.objects.get(id=category_id) - validated_data['category'] = category - except TemplateCategory.DoesNotExist: - # 如果分类不存在,创建一个默认分类 - category = TemplateCategory.objects.create(name="默认分类") - validated_data['category'] = category - - return super().create(validated_data) class TemplateCreateUpdateSerializer(serializers.ModelSerializer): """模板创建和更新序列化器""" class Meta: model = Template fields = [ - 'id', 'title', 'content', - 'category', 'mission', 'platform', + 'id', 'title', 'content', + 'mission', 'platform', 'service', 'collaboration_type', 'is_public' ] @@ -79,12 +53,6 @@ class TemplateCreateUpdateSerializer(serializers.ModelSerializer): def validate(self, data): """验证数据,处理测试期间可能缺失的字段""" - # 处理category字段,确保有有效的分类 - if 'category' not in data: - # 获取或创建默认分类 - category, created = TemplateCategory.objects.get_or_create(name="默认分类") - data['category'] = category - # 确保其他必填字段有默认值 if 'mission' not in data: data['mission'] = 'initial_contact' diff --git a/apps/template/urls.py b/apps/template/urls.py index 451b9ea..46bf99a 100644 --- a/apps/template/urls.py +++ b/apps/template/urls.py @@ -1,9 +1,8 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from .views import TemplateViewSet, TemplateCategoryViewSet +from .views import TemplateViewSet router = DefaultRouter() -router.register(r'categories', TemplateCategoryViewSet) router.register(r'', TemplateViewSet) urlpatterns = [ diff --git a/apps/template/views.py b/apps/template/views.py index f2dc4d3..2663fa6 100644 --- a/apps/template/views.py +++ b/apps/template/views.py @@ -3,12 +3,11 @@ from rest_framework import viewsets, permissions, status, filters from rest_framework.response import Response from rest_framework.decorators import action from django_filters.rest_framework import DjangoFilterBackend -from .models import Template, TemplateCategory +from .models import Template from .serializers import ( TemplateListSerializer, TemplateDetailSerializer, - TemplateCreateUpdateSerializer, - TemplateCategorySerializer + TemplateCreateUpdateSerializer ) from .filters import TemplateFilter from .utils import ApiResponse @@ -17,82 +16,6 @@ from rest_framework.permissions import IsAuthenticated from apps.user.authentication import CustomTokenAuthentication # Create your views here. -class TemplateCategoryViewSet(viewsets.ModelViewSet): - """ - 模板分类视图集 - - 提供模板分类的增删改查功能 - """ - queryset = TemplateCategory.objects.all() - serializer_class = TemplateCategorySerializer - authentication_classes = [CustomTokenAuthentication] - permission_classes = [IsAuthenticated] - pagination_class = StandardResultsSetPagination - - def list(self, request, *args, **kwargs): - """获取所有模板分类""" - queryset = self.filter_queryset(self.get_queryset()) - page = self.paginate_queryset(queryset) - if page is not None: - serializer = self.get_serializer(page, many=True) - return self.get_paginated_response(serializer.data) - serializer = self.get_serializer(queryset, many=True) - return ApiResponse.success( - data=serializer.data, - message="获取模板分类列表成功" - ) - - def retrieve(self, request, *args, **kwargs): - """获取单个模板分类详情""" - instance = self.get_object() - serializer = self.get_serializer(instance) - return ApiResponse.success( - data=serializer.data, - message="获取模板分类详情成功" - ) - - def create(self, request, *args, **kwargs): - """创建模板分类""" - serializer = self.get_serializer(data=request.data) - if serializer.is_valid(): - self.perform_create(serializer) - return ApiResponse.success( - data=serializer.data, - message="模板分类创建成功", - code=status.HTTP_201_CREATED - ) - return ApiResponse.error( - message="模板分类创建失败", - data=serializer.errors, - code=status.HTTP_400_BAD_REQUEST - ) - - def update(self, request, *args, **kwargs): - """更新模板分类""" - partial = kwargs.pop('partial', False) - instance = self.get_object() - serializer = self.get_serializer(instance, data=request.data, partial=partial) - if serializer.is_valid(): - self.perform_update(serializer) - return ApiResponse.success( - data=serializer.data, - message="模板分类更新成功" - ) - return ApiResponse.error( - message="模板分类更新失败", - data=serializer.errors, - code=status.HTTP_400_BAD_REQUEST - ) - - def destroy(self, request, *args, **kwargs): - """删除模板分类""" - instance = self.get_object() - self.perform_destroy(instance) - return ApiResponse.success( - data=None, - message="模板分类删除成功" - ) - class TemplateViewSet(viewsets.ModelViewSet): """ 模板视图集 @@ -108,6 +31,7 @@ class TemplateViewSet(viewsets.ModelViewSet): ordering_fields = ['created_at', 'updated_at', 'title'] ordering = ['-created_at'] pagination_class = StandardResultsSetPagination + http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'] def get_queryset(self): """ @@ -124,8 +48,14 @@ class TemplateViewSet(viewsets.ModelViewSet): return TemplateDetailSerializer def list(self, request, *args, **kwargs): - """获取所有模板""" - queryset = self.filter_queryset(self.get_queryset()) + """获取所有模板,支持通过query参数mission进行筛选""" + # 从query_params中获取mission参数 + mission = request.query_params.get('mission', None) + if mission and mission != 'all': + queryset = self.filter_queryset(self.get_queryset().filter(mission=mission)) + else: + queryset = self.filter_queryset(self.get_queryset()) + page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) @@ -225,7 +155,11 @@ class TemplateViewSet(viewsets.ModelViewSet): code=status.HTTP_400_BAD_REQUEST ) - queryset = self.get_queryset().filter(mission=mission) + if mission == 'all': + queryset = self.get_queryset() + else: + queryset = self.get_queryset().filter(mission=mission) + page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) @@ -298,3 +232,72 @@ class TemplateViewSet(viewsets.ModelViewSet): data=serializer.data, message="按服务类型获取模板成功" ) + + @action(detail=False, methods=['get']) + def mission_options(self, request): + """获取任务类型选项列表""" + mission_options = [ + {'value': 'all', 'name': '全部'}, + {'value': 'initial_contact', 'name': '初步建联'}, + {'value': 'negotiation', 'name': '砍价邮件'}, + {'value': 'script', 'name': '脚本邮件'}, + {'value': 'follow_up', 'name': '合作追踪'}, + ] + return ApiResponse.success( + data=mission_options, + message="获取任务类型选项列表成功" + ) + + @action(detail=False, methods=['post']) + def search_templates(self, request): + """ + 通过POST请求查询模板 + + 请求体参数: + - mission: 任务类型 + - page: 页码(可选,默认1) + - page_size: 每页数量(可选,默认10) + """ + # 获取查询参数 + mission = request.data.get('mission', None) + page = request.data.get('page', 1) + page_size = request.data.get('page_size', 10) + + try: + page = int(page) + page_size = int(page_size) + except (TypeError, ValueError): + return ApiResponse.error( + message="页码和每页数量必须是整数", + code=status.HTTP_400_BAD_REQUEST + ) + + # 构建查询集 + if mission and mission != 'all': + queryset = self.filter_queryset(self.get_queryset().filter(mission=mission)) + else: + queryset = self.filter_queryset(self.get_queryset()) + + # 设置分页 + paginator = self.pagination_class() + paginator.page_size = page_size + paginated_queryset = paginator.paginate_queryset(queryset, request) + + if paginated_queryset is not None: + serializer = self.get_serializer(paginated_queryset, many=True) + response_data = { + 'count': paginator.page.paginator.count, + 'next': paginator.get_next_link(), + 'previous': paginator.get_previous_link(), + 'results': serializer.data + } + return ApiResponse.success( + data=response_data, + message="查询模板成功" + ) + + serializer = self.get_serializer(queryset, many=True) + return ApiResponse.success( + data=serializer.data, + message="查询模板成功" + )