获取session摘要
This commit is contained in:
parent
38a1a0a808
commit
50c2191a65
@ -95,6 +95,27 @@ class SearchSessionViewSet(viewsets.ModelViewSet):
|
|||||||
return self.get_paginated_response(serializer.data)
|
return self.get_paginated_response(serializer.data)
|
||||||
serializer = CreatorSerializer(creators, many=True)
|
serializer = CreatorSerializer(creators, many=True)
|
||||||
return ApiResponse.success(serializer.data, "获取会话创作者列表成功")
|
return ApiResponse.success(serializer.data, "获取会话创作者列表成功")
|
||||||
|
|
||||||
|
@action(detail=False, methods=['get'])
|
||||||
|
def summary(self, request):
|
||||||
|
"""获取所有会话的摘要数据,用于展示在表格中"""
|
||||||
|
queryset = self.filter_queryset(self.get_queryset())
|
||||||
|
|
||||||
|
# 格式化响应数据
|
||||||
|
result = []
|
||||||
|
for session in queryset:
|
||||||
|
result.append({
|
||||||
|
'id': session.id,
|
||||||
|
'session_number': session.session_number,
|
||||||
|
'date': session.date_created,
|
||||||
|
'creator_count': session.creator_count,
|
||||||
|
'shoppable_creators': session.shoppable_creators,
|
||||||
|
'avg_followers': session.avg_followers,
|
||||||
|
'avg_gmv': session.avg_gmv,
|
||||||
|
'avg_video_views': session.avg_video_views
|
||||||
|
})
|
||||||
|
|
||||||
|
return ApiResponse.success(result, "获取会话摘要列表成功")
|
||||||
|
|
||||||
|
|
||||||
class CreatorDiscoveryViewSet(viewsets.ReadOnlyModelViewSet):
|
class CreatorDiscoveryViewSet(viewsets.ReadOnlyModelViewSet):
|
||||||
@ -132,149 +153,107 @@ class CreatorDiscoveryViewSet(viewsets.ReadOnlyModelViewSet):
|
|||||||
ecommerce_level = request.data.get('ecommerce_level', None)
|
ecommerce_level = request.data.get('ecommerce_level', None)
|
||||||
exposure_level = request.data.get('exposure_level', None)
|
exposure_level = request.data.get('exposure_level', None)
|
||||||
|
|
||||||
# 创建模拟搜索会话
|
try:
|
||||||
session = self._create_mock_search_session()
|
# 导入CreatorProfile模型
|
||||||
|
from apps.daren_detail.models import CreatorProfile
|
||||||
# 生成模拟搜索结果
|
import logging
|
||||||
creators = self._generate_mock_creators(session, query, category, ecommerce_level, exposure_level)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# 返回会话详情
|
|
||||||
serializer = SearchSessionDetailSerializer(session)
|
|
||||||
return ApiResponse.success(serializer.data, "搜索创作者成功")
|
|
||||||
|
|
||||||
def _create_mock_search_session(self):
|
|
||||||
"""创建模拟搜索会话"""
|
|
||||||
# 获取当前最大会话编号并加1
|
|
||||||
max_session_number = SearchSession.objects.all().order_by('-session_number').first()
|
|
||||||
session_number = 1
|
|
||||||
if max_session_number:
|
|
||||||
session_number = max_session_number.session_number + 1
|
|
||||||
|
|
||||||
# 创建新会话
|
# 获取或创建当天的session
|
||||||
session = SearchSession.objects.create(
|
today = timezone.now().date()
|
||||||
session_number=session_number,
|
today_session = SearchSession.objects.filter(date_created=today).first()
|
||||||
creator_count=100,
|
|
||||||
shoppable_creators=26,
|
|
||||||
avg_followers=162.2,
|
|
||||||
avg_gmv=534.1,
|
|
||||||
avg_video_views=1.9,
|
|
||||||
date_created=timezone.now().date() # 将datetime转换为date类型
|
|
||||||
)
|
|
||||||
return session
|
|
||||||
|
|
||||||
def _generate_mock_creators(self, session, query, category=None, ecommerce_level=None, exposure_level=None):
|
|
||||||
"""生成模拟创作者数据"""
|
|
||||||
# 模拟数据 - 这里可以根据实际需求调整
|
|
||||||
mock_creators = [
|
|
||||||
{
|
|
||||||
"name": "Mock Creator 1",
|
|
||||||
"category": "Phones & Electronics",
|
|
||||||
"ecommerce_level": "L2",
|
|
||||||
"exposure_level": "KOC-1",
|
|
||||||
"followers": 162.2,
|
|
||||||
"gmv": 534.1,
|
|
||||||
"items_sold": 18.1,
|
|
||||||
"avg_video_views": 1.9,
|
|
||||||
"has_ecommerce": True
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Mock Creator 2",
|
|
||||||
"category": "Womenswear & Underwear",
|
|
||||||
"ecommerce_level": "L3",
|
|
||||||
"exposure_level": "KOL-3",
|
|
||||||
"followers": 162.2,
|
|
||||||
"gmv": 534.1,
|
|
||||||
"items_sold": 18.1,
|
|
||||||
"avg_video_views": 1.9,
|
|
||||||
"has_ecommerce": False
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Mock Creator 3",
|
|
||||||
"category": "Sports & Outdoor",
|
|
||||||
"ecommerce_level": "L4",
|
|
||||||
"exposure_level": "KOC-2",
|
|
||||||
"followers": 162.2,
|
|
||||||
"gmv": 534.1,
|
|
||||||
"items_sold": 18.1,
|
|
||||||
"avg_video_views": 1.9,
|
|
||||||
"has_ecommerce": True
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Mock Creator 4",
|
|
||||||
"category": "Food & Beverage",
|
|
||||||
"ecommerce_level": "L1",
|
|
||||||
"exposure_level": "KOC-2",
|
|
||||||
"followers": 162.2,
|
|
||||||
"gmv": 534.1,
|
|
||||||
"items_sold": 18.1,
|
|
||||||
"avg_video_views": 1.9,
|
|
||||||
"has_ecommerce": True
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Mock Creator 5",
|
|
||||||
"category": "Health",
|
|
||||||
"ecommerce_level": "L5",
|
|
||||||
"exposure_level": "KOL-2",
|
|
||||||
"followers": 162.2,
|
|
||||||
"gmv": 534.1,
|
|
||||||
"items_sold": 18.1,
|
|
||||||
"avg_video_views": 1.9,
|
|
||||||
"has_ecommerce": False
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Mock Creator 6",
|
|
||||||
"category": "Kitchenware",
|
|
||||||
"ecommerce_level": "New tag",
|
|
||||||
"exposure_level": "New tag",
|
|
||||||
"followers": 162.2,
|
|
||||||
"gmv": 534.1,
|
|
||||||
"items_sold": 18.1,
|
|
||||||
"avg_video_views": 1.9,
|
|
||||||
"has_ecommerce": True
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Mock Creator 7",
|
|
||||||
"category": "Furniture",
|
|
||||||
"ecommerce_level": "New tag",
|
|
||||||
"exposure_level": "New tag",
|
|
||||||
"followers": 162.2,
|
|
||||||
"gmv": 534.1,
|
|
||||||
"items_sold": 18.1,
|
|
||||||
"avg_video_views": 1.9,
|
|
||||||
"has_ecommerce": False
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Mock Creator 8",
|
|
||||||
"category": "Shoes",
|
|
||||||
"ecommerce_level": "New tag",
|
|
||||||
"exposure_level": "New tag",
|
|
||||||
"followers": 162.2,
|
|
||||||
"gmv": 534.1,
|
|
||||||
"items_sold": 18.1,
|
|
||||||
"avg_video_views": 1.9,
|
|
||||||
"has_ecommerce": True
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
# 根据查询条件过滤模拟数据
|
|
||||||
filtered_creators = mock_creators
|
|
||||||
if category:
|
|
||||||
filtered_creators = [c for c in filtered_creators if c['category'] == category]
|
|
||||||
if ecommerce_level:
|
|
||||||
filtered_creators = [c for c in filtered_creators if c['ecommerce_level'] == ecommerce_level]
|
|
||||||
if exposure_level:
|
|
||||||
filtered_creators = [c for c in filtered_creators if c['exposure_level'] == exposure_level]
|
|
||||||
|
|
||||||
# 创建创作者记录
|
|
||||||
for creator_data in filtered_creators:
|
|
||||||
Creator.objects.create(
|
|
||||||
session=session,
|
|
||||||
**creator_data
|
|
||||||
)
|
|
||||||
|
|
||||||
# 更新会话统计信息
|
if not today_session:
|
||||||
session.creator_count = len(filtered_creators)
|
# 如果当天没有session,创建一个
|
||||||
session.shoppable_creators = len([c for c in filtered_creators if c['has_ecommerce']])
|
max_session_number = SearchSession.objects.all().order_by('-session_number').first()
|
||||||
session.save()
|
session_number = 1
|
||||||
|
if max_session_number:
|
||||||
return filtered_creators
|
session_number = max_session_number.session_number + 1
|
||||||
|
|
||||||
|
today_session = SearchSession.objects.create(
|
||||||
|
session_number=session_number,
|
||||||
|
creator_count=0,
|
||||||
|
shoppable_creators=0,
|
||||||
|
avg_followers=0,
|
||||||
|
avg_gmv=0,
|
||||||
|
avg_video_views=0,
|
||||||
|
date_created=today
|
||||||
|
)
|
||||||
|
|
||||||
|
# 构建查询条件
|
||||||
|
query_filters = {}
|
||||||
|
if query:
|
||||||
|
query_filters['name__icontains'] = query
|
||||||
|
if category:
|
||||||
|
query_filters['category'] = category
|
||||||
|
if ecommerce_level:
|
||||||
|
if isinstance(ecommerce_level, str) and ecommerce_level.startswith('L') and len(ecommerce_level) > 1:
|
||||||
|
try:
|
||||||
|
ecommerce_level_num = int(ecommerce_level[1:])
|
||||||
|
query_filters['e_commerce_level'] = ecommerce_level_num
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
query_filters['e_commerce_level'] = ecommerce_level
|
||||||
|
if exposure_level:
|
||||||
|
query_filters['exposure_level'] = exposure_level
|
||||||
|
|
||||||
|
# 查询CreatorProfile表
|
||||||
|
creator_profiles = CreatorProfile.objects.filter(**query_filters)
|
||||||
|
|
||||||
|
# 对每个找到的CreatorProfile创建Creator记录
|
||||||
|
for profile in creator_profiles:
|
||||||
|
# 检查是否已经在当前session中存在相同creator
|
||||||
|
existing_creator = Creator.objects.filter(
|
||||||
|
session=today_session,
|
||||||
|
name=profile.name
|
||||||
|
).first()
|
||||||
|
|
||||||
|
if not existing_creator:
|
||||||
|
# 确定电商等级字符串
|
||||||
|
ecommerce_level_str = "New tag"
|
||||||
|
if profile.e_commerce_level is not None:
|
||||||
|
ecommerce_level_str = f"L{profile.e_commerce_level}"
|
||||||
|
|
||||||
|
# 创建Creator记录
|
||||||
|
Creator.objects.create(
|
||||||
|
session=today_session,
|
||||||
|
name=profile.name,
|
||||||
|
avatar=profile.avatar_url if profile.avatar_url else None,
|
||||||
|
category=profile.category if profile.category else "Other",
|
||||||
|
ecommerce_level=ecommerce_level_str,
|
||||||
|
exposure_level=profile.exposure_level if profile.exposure_level else "New tag",
|
||||||
|
followers=float(profile.followers) if profile.followers else 0,
|
||||||
|
gmv=float(profile.gmv) if profile.gmv else 0,
|
||||||
|
items_sold=float(profile.items_sold) if profile.items_sold else 0,
|
||||||
|
avg_video_views=float(profile.avg_video_views) if profile.avg_video_views else 0,
|
||||||
|
has_ecommerce=profile.e_commerce_level is not None,
|
||||||
|
tiktok_url=profile.tiktok_link if profile.tiktok_link else None
|
||||||
|
)
|
||||||
|
|
||||||
|
# 更新session统计信息
|
||||||
|
all_creators = today_session.creators.all()
|
||||||
|
total_creators = all_creators.count()
|
||||||
|
|
||||||
|
if total_creators > 0:
|
||||||
|
# 计算平均值
|
||||||
|
total_followers = sum(creator.followers for creator in all_creators)
|
||||||
|
total_gmv = sum(creator.gmv for creator in all_creators)
|
||||||
|
total_video_views = sum(creator.avg_video_views for creator in all_creators)
|
||||||
|
|
||||||
|
today_session.creator_count = total_creators
|
||||||
|
today_session.shoppable_creators = all_creators.filter(has_ecommerce=True).count()
|
||||||
|
today_session.avg_followers = round(total_followers / total_creators, 1)
|
||||||
|
today_session.avg_gmv = round(total_gmv / total_creators, 1)
|
||||||
|
today_session.avg_video_views = round(total_video_views / total_creators, 1)
|
||||||
|
today_session.save()
|
||||||
|
|
||||||
|
# 返回session详情
|
||||||
|
serializer = SearchSessionDetailSerializer(today_session)
|
||||||
|
return ApiResponse.success(serializer.data, "搜索创作者成功")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
import traceback
|
||||||
|
logger.error(f"搜索创作者时发生错误: {str(e)}")
|
||||||
|
logger.error(traceback.format_exc())
|
||||||
|
return ApiResponse.error(f"搜索创作者失败: {str(e)}")
|
||||||
|
Loading…
Reference in New Issue
Block a user