品牌相关

This commit is contained in:
jlj 2025-06-05 15:43:42 +08:00
parent e4dd2808da
commit d899ec76ad
2 changed files with 156 additions and 0 deletions

View File

@ -35,6 +35,8 @@ urlpatterns = [
# 添加Campaign相关API # 添加Campaign相关API
path('campaigns/', views.get_campaigns, name='get_campaigns'), path('campaigns/', views.get_campaigns, name='get_campaigns'),
path('campaigns/add/', views.add_to_campaign, name='add_to_campaign'), path('campaigns/add/', views.add_to_campaign, name='add_to_campaign'),
# 新增品牌合作活动列表API
path('brand/campaigns/', views.get_brand_campaigns, name='get_brand_campaigns'),
# 新增的指标相关API # 新增的指标相关API
path('creators/<int:creator_id>/metrics/', views.get_creator_metrics, name='get_creator_metrics'), path('creators/<int:creator_id>/metrics/', views.get_creator_metrics, name='get_creator_metrics'),

View File

@ -3856,6 +3856,160 @@ def search_private_creators(request):
}, json_dumps_params={'ensure_ascii': False}) }, json_dumps_params={'ensure_ascii': False})
@api_view(['GET'])
@authentication_classes([CustomTokenAuthentication])
@csrf_exempt
@require_http_methods(["GET"])
def get_brand_campaigns(request):
"""获取品牌合作活动列表必须指定达人ID"""
try:
from apps.brands.models import Campaign, Brand, Product
from .models import CreatorCampaign, CreatorProfile
# 获取分页参数
page = int(request.GET.get('page', 1))
page_size = int(request.GET.get('page_size', 10))
# 获取过滤参数
brand_id = request.GET.get('brand_id')
status = request.GET.get('status')
creator_id = request.GET.get('creator_id')
# 验证creator_id参数是否提供
if not creator_id:
return JsonResponse({
'code': 400,
'message': '缺少必要参数: creator_id',
'data': None
}, json_dumps_params={'ensure_ascii': False})
# 验证达人是否存在
try:
creator = CreatorProfile.objects.get(id=creator_id)
# 获取该达人参与的所有活动ID
creator_campaigns = CreatorCampaign.objects.filter(creator=creator)
campaign_ids = [cc.campaign_id for cc in creator_campaigns]
# 基础查询 - 筛选该达人参与的活动
campaigns_query = Campaign.objects.filter(is_active=True, id__in=campaign_ids)
except CreatorProfile.DoesNotExist:
return JsonResponse({
'code': 404,
'message': f'未找到ID为 {creator_id} 的达人',
'data': None
}, json_dumps_params={'ensure_ascii': False})
# 应用品牌过滤
if brand_id:
campaigns_query = campaigns_query.filter(brand_id=brand_id)
# 应用状态过滤
if status:
campaigns_query = campaigns_query.filter(status=status)
# 获取总数据量
total_count = campaigns_query.count()
# 计算分页
start = (page - 1) * page_size
end = start + page_size
# 执行查询并分页
campaigns = campaigns_query.order_by('-created_at')[start:end]
campaign_list = []
for campaign in campaigns:
# 获取品牌信息和首字母
if isinstance(campaign.brand, Brand):
brand_name = campaign.brand.name
brand_id_str = str(campaign.brand.id)
else:
brand_name = str(campaign.brand) if campaign.brand else ""
brand_id_str = ""
# 获取品牌首字母用于显示
first_letter = brand_name[:1].upper() if brand_name else ""
# 构造品牌信息
brand_info = {
"id": brand_id_str,
"name": brand_name,
"first_letter": first_letter
}
# 格式化时间
start_date = campaign.start_date.strftime('%m/%d/%Y') if campaign.start_date else ""
end_date = campaign.end_date.strftime('%m/%d/%Y') if campaign.end_date else ""
# 获取价格信息
price_detail = ""
if campaign.budget:
if isinstance(campaign.budget, str):
# 如果已经是字符串且包含$符号,直接使用
if '$' in campaign.budget:
price_detail = campaign.budget
else:
price_detail = f"${campaign.budget}"
else:
# 如果是数字,格式化为带$的字符串
price_detail = f"${campaign.budget}"
# 格式化GMV和观看量
gmv_achieved = campaign.gmv_achieved or ""
views_achieved = campaign.views_achieved or ""
# 获取该达人在此活动中的状态
try:
creator_campaign = CreatorCampaign.objects.get(creator_id=creator_id, campaign=campaign)
status_value = creator_campaign.status
except CreatorCampaign.DoesNotExist:
status_value = ""
# 构造活动数据 - 精确匹配图片中的表格列
campaign_data = {
"brand": brand_info,
"pricing_detail": price_detail,
"start_date": start_date,
"end_date": end_date,
"status": status_value,
"gmv_achieved": gmv_achieved,
"views_achieved": views_achieved,
"video_link": campaign.video_link or ""
}
campaign_list.append(campaign_data)
# 计算总页数
total_pages = (total_count + page_size - 1) // page_size
# 构造分页信息
pagination = {
"current_page": page,
"total_pages": total_pages,
"total_count": total_count,
"has_next": page < total_pages,
"has_prev": page > 1
}
return JsonResponse({
'code': 200,
'message': '获取成功',
'data': campaign_list,
'pagination': pagination
}, json_dumps_params={'ensure_ascii': False})
except Exception as e:
logger.error(f"获取品牌合作活动列表失败: {e}")
import traceback
logger.error(f"详细错误: {traceback.format_exc()}")
return JsonResponse({
'code': 500,
'message': f'获取品牌合作活动列表失败: {str(e)}',
'data': None
}, json_dumps_params={'ensure_ascii': False})