diff --git a/apps/brands/views.py b/apps/brands/views.py index 90803e8..53ecd7f 100644 --- a/apps/brands/views.py +++ b/apps/brands/views.py @@ -264,6 +264,46 @@ class CampaignViewSet(viewsets.ModelViewSet): return [] return super().get_permissions() + @action(detail=False, methods=['get'], url_path='by-product') + def get_campaigns_by_product(self, request): + """获取与特定产品相关的活动列表""" + try: + product_id = request.query_params.get('product_id') + if not product_id: + return api_response(code=400, message="缺少必要参数:product_id", data=None) + + # 查询产品是否存在 + from .models import Product + try: + product = Product.objects.get(id=product_id, is_active=True) + except Product.DoesNotExist: + return api_response(code=404, message=f"产品不存在: {product_id}", data=None) + + # 查询与该产品关联的所有活动 + campaigns = Campaign.objects.filter( + link_product=product, + is_active=True + ).distinct() + + # 序列化活动数据 + serializer = self.get_serializer(campaigns, many=True) + + return api_response(data={ + 'product': { + 'id': str(product.id), + 'name': product.name, + 'brand': product.brand.name if product.brand else None + }, + 'campaigns': serializer.data, + 'total': campaigns.count() + }) + + except Exception as e: + logger.error(f"获取产品相关活动列表失败: {str(e)}") + import traceback + logger.error(traceback.format_exc()) + return api_response(code=500, message=f"获取产品相关活动列表失败: {str(e)}", data=None) + @action(detail=False, methods=['get'], url_path='token-info') def token_info(self, request): """获取当前用户的token信息和WebSocket URL示例"""