修改响应格式

This commit is contained in:
jlj 2025-05-29 11:07:32 +08:00
parent 8768fd7421
commit 1d1e7cf760

View File

@ -531,7 +531,7 @@ def get_creator_detail(request, creator_id):
"name": creator.name,
"avatar": creator.avatar_url,
"email": creator.email,
"social_user": {
"social_accounts": {
"instagram": creator.instagram, # 示例数据,实际应从数据库获取
"tiktok": creator.tiktok_link # 示例链接
},
@ -2933,9 +2933,8 @@ def filter_public_creators(request):
# 平台过滤tiktok, instagram, youtube等单选
platform = filter_data.get('platform')
if platform and len(platform) > 0:
platform_value = platform[0] # 单选,取第一个值
public_creators = public_creators.filter(creator__profile=platform_value)
if platform and platform:
public_creators = public_creators.filter(creator__profile=platform)
# GMV范围过滤 ($0-$5k, $5k-$25k, $25k-$50k等),多选
gmv_range = filter_data.get('gmv_range')
@ -3173,9 +3172,8 @@ def filter_private_pool_creators(request):
# 平台过滤tiktok, instagram, youtube等单选
platform = filter_data.get('platform')
if platform and len(platform) > 0:
platform_value = platform[0] # 单选,取第一个值
creator_relations = creator_relations.filter(creator__profile=platform_value)
if platform and platform:
creator_relations = creator_relations.filter(creator__profile=platform)
# GMV范围过滤 ($0-$5k, $5k-$25k, $25k-$50k等),多选
gmv_range = filter_data.get('gmv_range')
@ -3557,31 +3555,8 @@ def search_creators(request):
# 使用第一个关键词进行排序优化
first_keyword = keywords[0] if 'keywords' in locals() and keywords else search_query
# 优化排序逻辑,支持单个字符的精确匹配
query = query.extra(
select={
# 完全匹配优先级最高
'name_exact_match': "CASE WHEN LOWER(creator_profiles.name) = LOWER(%s) THEN 1 ELSE 0 END",
# 名称开头匹配优先级第二
'name_starts_with': "CASE WHEN LOWER(creator_profiles.name) LIKE LOWER(%s) THEN 1 ELSE 0 END",
# 名称包含匹配优先级第三
'name_contains': "CASE WHEN LOWER(creator_profiles.name) LIKE LOWER(%s) THEN 1 ELSE 0 END",
# 分类匹配优先级第四
'category_match': "CASE WHEN LOWER(creator_profiles.category) LIKE LOWER(%s) THEN 1 ELSE 0 END"
},
select_params=[
first_keyword,
first_keyword + '%',
'%' + first_keyword + '%',
'%' + first_keyword + '%'
]
).order_by(
'-name_exact_match',
'-name_starts_with',
'-name_contains',
'-category_match',
'creator__name'
)
# 简化排序逻辑避免使用tiktok_link字段
query = query.order_by('creator__name')
else:
# 如果没有搜索词,按名称排序
query = query.order_by('creator__name')
@ -3613,29 +3588,24 @@ def search_creators(request):
# 格式化价格
pricing_formatted = f"${creator.pricing}" if creator.pricing else None
# 格式化结果
# 使用与filter_public_creators相同的格式
formatted_creator = {
"Creator": {
"name": creator.name,
"avatar": creator.get_avatar_url()
},
"Category": creator.category,
"E-commerce Level": e_commerce_level_formatted,
"Exposure Level": creator.exposure_level,
"Followers": followers_formatted,
"GMV": gmv_formatted,
"Items Sold": f"{creator.items_sold}k" if creator.items_sold else None,
"Avg. Video Views": avg_views_formatted,
"Pricing": pricing_formatted,
"Pricing Package": creator.pricing_package,
"# Collab": creator.collab_count,
"Latest Collab.": creator.latest_collab,
"E-commerce": creator.e_commerce_platforms,
"creator_id": creator.id, # 添加ID用于后续操作
"profile": creator.profile if hasattr(creator, 'profile') else 'tiktok', # 平台信息
"public_pool_category": public_creator.category, # 公有库分类
"public_pool_remark": public_creator.remark, # 公有库备注
"is_public": True # 标识这是公有达人库的达人
"public_id": public_creator.id,
"creator_id": creator.id,
"name": creator.name,
"avatar": creator.get_avatar_url(),
"category": creator.category,
"e_commerce_level": e_commerce_level_formatted,
"exposure_level": creator.exposure_level,
"platform": creator.profile if hasattr(creator, 'profile') else 'tiktok',
"followers": followers_formatted,
"gmv": gmv_formatted,
"avg_video_views": avg_views_formatted,
"pricing": pricing_formatted,
"pricing_package": creator.pricing_package,
"collab_count": creator.collab_count,
"remark": public_creator.remark,
"category_public": public_creator.category
}
creator_list.append(formatted_creator)
@ -3648,11 +3618,10 @@ def search_creators(request):
"total_pages": total_pages,
"total_count": total_count,
"has_next": page < total_pages,
"has_prev": page > 1,
"page_size": page_size
"has_prev": page > 1
}
# 构造搜索信息
# 构造搜索信息(可以作为额外信息保留)
search_info = {
"query": search_query,
"keywords": keywords if 'keywords' in locals() else [],
@ -3666,11 +3635,9 @@ def search_creators(request):
return JsonResponse({
'code': 200,
'message': '搜索成功',
'data': {
'creators': creator_list,
'pagination': pagination,
'search_info': search_info
}
'data': creator_list,
'pagination': pagination,
'search_info': search_info
}, json_dumps_params={'ensure_ascii': False})
except Exception as e:
@ -3813,31 +3780,8 @@ def search_private_creators(request):
# 使用第一个关键词进行排序优化
first_keyword = keywords[0] if 'keywords' in locals() and keywords else search_query
# 优化排序逻辑,支持单个字符的精确匹配
query = query.extra(
select={
# 完全匹配优先级最高
'name_exact_match': "CASE WHEN LOWER(creator_profiles.name) = LOWER(%s) THEN 1 ELSE 0 END",
# 名称开头匹配优先级第二
'name_starts_with': "CASE WHEN LOWER(creator_profiles.name) LIKE LOWER(%s) THEN 1 ELSE 0 END",
# 名称包含匹配优先级第三
'name_contains': "CASE WHEN LOWER(creator_profiles.name) LIKE LOWER(%s) THEN 1 ELSE 0 END",
# 分类匹配优先级第四
'category_match': "CASE WHEN LOWER(creator_profiles.category) LIKE LOWER(%s) THEN 1 ELSE 0 END"
},
select_params=[
first_keyword,
first_keyword + '%',
'%' + first_keyword + '%',
'%' + first_keyword + '%'
]
).order_by(
'-name_exact_match',
'-name_starts_with',
'-name_contains',
'-category_match',
'creator__name'
)
# 简化排序逻辑避免使用tiktok_link字段
query = query.order_by('creator__name')
else:
# 如果没有搜索词,按名称排序
query = query.order_by('creator__name')
@ -3866,38 +3810,33 @@ def search_private_creators(request):
followers_formatted = f"{int(creator.followers / 1000)}k" if creator.followers else "0"
avg_views_formatted = f"{int(creator.avg_video_views / 1000)}k" if creator.avg_video_views else "0"
# 格式化价格
pricing_formatted = f"${creator.pricing}" if creator.pricing else None
# 格式化价格区间
if creator.pricing is not None:
pricing_range = f"${creator.pricing}"
else:
pricing_range = None
# 格式化结果
# 格式化结果 - 使用与filter_private_pool_creators相同的格式
formatted_creator = {
"Creator": {
"name": creator.name,
"avatar": creator.get_avatar_url()
},
"Category": creator.category,
"E-commerce Level": e_commerce_level_formatted,
"Exposure Level": creator.exposure_level,
"Followers": followers_formatted,
"GMV": gmv_formatted,
"Items Sold": f"{creator.items_sold}k" if creator.items_sold else None,
"Avg. Video Views": avg_views_formatted,
"Pricing": pricing_formatted,
"Pricing Package": creator.pricing_package,
"# Collab": creator.collab_count,
"Latest Collab.": creator.latest_collab,
"E-commerce": creator.e_commerce_platforms,
"creator_id": creator.id, # 添加ID用于后续操作
"profile": creator.profile if hasattr(creator, 'profile') else 'tiktok', # 平台信息
"private_pool": {
"id": relation.private_pool.id,
"name": relation.private_pool.name,
"is_default": relation.private_pool.is_default
},
"notes": relation.notes, # 私有库中的笔记
"status": relation.status, # 私有库中的状态
"relation_id": relation.id, # 关联ID
"is_private": True # 标识这是私有达人库的达人
"relation_id": relation.id,
"creator_id": creator.id,
"name": creator.name,
"avatar": creator.get_avatar_url(),
"category": creator.category,
"e_commerce_level": e_commerce_level_formatted,
"exposure_level": creator.exposure_level,
"platform": creator.profile if hasattr(creator, 'profile') else 'tiktok',
"followers": followers_formatted,
"gmv": gmv_formatted,
"avg_video_views": avg_views_formatted,
"pricing": pricing_range,
"collab_count": creator.collab_count,
"notes": relation.notes,
"status": relation.status,
"added_from_public": relation.added_from_public,
"added_at": relation.created_at.strftime('%Y-%m-%d'),
"is_public_removed": relation.status == 'public_removed',
"status_note": "该达人已从公有库中移除" if relation.status == 'public_removed' else None
}
creator_list.append(formatted_creator)
@ -3910,8 +3849,7 @@ def search_private_creators(request):
"total_pages": total_pages,
"total_count": total_count,
"has_next": page < total_pages,
"has_prev": page > 1,
"page_size": page_size
"has_prev": page > 1
}
# 构造搜索信息
@ -3926,14 +3864,25 @@ def search_private_creators(request):
"pool_id": pool_id # 返回当前搜索的池ID如果有的话
}
# 构造私有库信息如果有特定池ID
pool_info = None
if pool_id and 'pool' in locals():
pool_info = {
"id": pool.id,
"name": pool.name,
"description": pool.description,
"is_default": pool.is_default,
"user_id": pool.user_id,
"created_at": pool.created_at.strftime('%Y-%m-%d')
}
return JsonResponse({
'code': 200,
'message': '搜索成功',
'data': {
'creators': creator_list,
'pagination': pagination,
'search_info': search_info
}
'data': creator_list,
'pagination': pagination,
'search_info': search_info,
'pool_info': pool_info
}, json_dumps_params={'ensure_ascii': False})
except Exception as e: