修改响应格式

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, "name": creator.name,
"avatar": creator.avatar_url, "avatar": creator.avatar_url,
"email": creator.email, "email": creator.email,
"social_user": { "social_accounts": {
"instagram": creator.instagram, # 示例数据,实际应从数据库获取 "instagram": creator.instagram, # 示例数据,实际应从数据库获取
"tiktok": creator.tiktok_link # 示例链接 "tiktok": creator.tiktok_link # 示例链接
}, },
@ -2933,9 +2933,8 @@ def filter_public_creators(request):
# 平台过滤tiktok, instagram, youtube等单选 # 平台过滤tiktok, instagram, youtube等单选
platform = filter_data.get('platform') platform = filter_data.get('platform')
if platform and len(platform) > 0: if platform and platform:
platform_value = platform[0] # 单选,取第一个值 public_creators = public_creators.filter(creator__profile=platform)
public_creators = public_creators.filter(creator__profile=platform_value)
# GMV范围过滤 ($0-$5k, $5k-$25k, $25k-$50k等),多选 # GMV范围过滤 ($0-$5k, $5k-$25k, $25k-$50k等),多选
gmv_range = filter_data.get('gmv_range') gmv_range = filter_data.get('gmv_range')
@ -3173,9 +3172,8 @@ def filter_private_pool_creators(request):
# 平台过滤tiktok, instagram, youtube等单选 # 平台过滤tiktok, instagram, youtube等单选
platform = filter_data.get('platform') platform = filter_data.get('platform')
if platform and len(platform) > 0: if platform and platform:
platform_value = platform[0] # 单选,取第一个值 creator_relations = creator_relations.filter(creator__profile=platform)
creator_relations = creator_relations.filter(creator__profile=platform_value)
# GMV范围过滤 ($0-$5k, $5k-$25k, $25k-$50k等),多选 # GMV范围过滤 ($0-$5k, $5k-$25k, $25k-$50k等),多选
gmv_range = filter_data.get('gmv_range') 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 first_keyword = keywords[0] if 'keywords' in locals() and keywords else search_query
# 优化排序逻辑,支持单个字符的精确匹配 # 简化排序逻辑避免使用tiktok_link字段
query = query.extra( query = query.order_by('creator__name')
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'
)
else: else:
# 如果没有搜索词,按名称排序 # 如果没有搜索词,按名称排序
query = query.order_by('creator__name') query = query.order_by('creator__name')
@ -3613,29 +3588,24 @@ def search_creators(request):
# 格式化价格 # 格式化价格
pricing_formatted = f"${creator.pricing}" if creator.pricing else None pricing_formatted = f"${creator.pricing}" if creator.pricing else None
# 格式化结果 # 使用与filter_public_creators相同的格式
formatted_creator = { formatted_creator = {
"Creator": { "public_id": public_creator.id,
"name": creator.name, "creator_id": creator.id,
"avatar": creator.get_avatar_url() "name": creator.name,
}, "avatar": creator.get_avatar_url(),
"Category": creator.category, "category": creator.category,
"E-commerce Level": e_commerce_level_formatted, "e_commerce_level": e_commerce_level_formatted,
"Exposure Level": creator.exposure_level, "exposure_level": creator.exposure_level,
"Followers": followers_formatted, "platform": creator.profile if hasattr(creator, 'profile') else 'tiktok',
"GMV": gmv_formatted, "followers": followers_formatted,
"Items Sold": f"{creator.items_sold}k" if creator.items_sold else None, "gmv": gmv_formatted,
"Avg. Video Views": avg_views_formatted, "avg_video_views": avg_views_formatted,
"Pricing": pricing_formatted, "pricing": pricing_formatted,
"Pricing Package": creator.pricing_package, "pricing_package": creator.pricing_package,
"# Collab": creator.collab_count, "collab_count": creator.collab_count,
"Latest Collab.": creator.latest_collab, "remark": public_creator.remark,
"E-commerce": creator.e_commerce_platforms, "category_public": public_creator.category
"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 # 标识这是公有达人库的达人
} }
creator_list.append(formatted_creator) creator_list.append(formatted_creator)
@ -3648,11 +3618,10 @@ def search_creators(request):
"total_pages": total_pages, "total_pages": total_pages,
"total_count": total_count, "total_count": total_count,
"has_next": page < total_pages, "has_next": page < total_pages,
"has_prev": page > 1, "has_prev": page > 1
"page_size": page_size
} }
# 构造搜索信息 # 构造搜索信息(可以作为额外信息保留)
search_info = { search_info = {
"query": search_query, "query": search_query,
"keywords": keywords if 'keywords' in locals() else [], "keywords": keywords if 'keywords' in locals() else [],
@ -3666,11 +3635,9 @@ def search_creators(request):
return JsonResponse({ return JsonResponse({
'code': 200, 'code': 200,
'message': '搜索成功', 'message': '搜索成功',
'data': { 'data': creator_list,
'creators': creator_list, 'pagination': pagination,
'pagination': pagination, 'search_info': search_info
'search_info': search_info
}
}, json_dumps_params={'ensure_ascii': False}) }, json_dumps_params={'ensure_ascii': False})
except Exception as e: 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 first_keyword = keywords[0] if 'keywords' in locals() and keywords else search_query
# 优化排序逻辑,支持单个字符的精确匹配 # 简化排序逻辑避免使用tiktok_link字段
query = query.extra( query = query.order_by('creator__name')
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'
)
else: else:
# 如果没有搜索词,按名称排序 # 如果没有搜索词,按名称排序
query = query.order_by('creator__name') 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" 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" 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 = { formatted_creator = {
"Creator": { "relation_id": relation.id,
"name": creator.name, "creator_id": creator.id,
"avatar": creator.get_avatar_url() "name": creator.name,
}, "avatar": creator.get_avatar_url(),
"Category": creator.category, "category": creator.category,
"E-commerce Level": e_commerce_level_formatted, "e_commerce_level": e_commerce_level_formatted,
"Exposure Level": creator.exposure_level, "exposure_level": creator.exposure_level,
"Followers": followers_formatted, "platform": creator.profile if hasattr(creator, 'profile') else 'tiktok',
"GMV": gmv_formatted, "followers": followers_formatted,
"Items Sold": f"{creator.items_sold}k" if creator.items_sold else None, "gmv": gmv_formatted,
"Avg. Video Views": avg_views_formatted, "avg_video_views": avg_views_formatted,
"Pricing": pricing_formatted, "pricing": pricing_range,
"Pricing Package": creator.pricing_package, "collab_count": creator.collab_count,
"# Collab": creator.collab_count, "notes": relation.notes,
"Latest Collab.": creator.latest_collab, "status": relation.status,
"E-commerce": creator.e_commerce_platforms, "added_from_public": relation.added_from_public,
"creator_id": creator.id, # 添加ID用于后续操作 "added_at": relation.created_at.strftime('%Y-%m-%d'),
"profile": creator.profile if hasattr(creator, 'profile') else 'tiktok', # 平台信息 "is_public_removed": relation.status == 'public_removed',
"private_pool": { "status_note": "该达人已从公有库中移除" if relation.status == 'public_removed' else None
"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 # 标识这是私有达人库的达人
} }
creator_list.append(formatted_creator) creator_list.append(formatted_creator)
@ -3910,8 +3849,7 @@ def search_private_creators(request):
"total_pages": total_pages, "total_pages": total_pages,
"total_count": total_count, "total_count": total_count,
"has_next": page < total_pages, "has_next": page < total_pages,
"has_prev": page > 1, "has_prev": page > 1
"page_size": page_size
} }
# 构造搜索信息 # 构造搜索信息
@ -3926,14 +3864,25 @@ def search_private_creators(request):
"pool_id": pool_id # 返回当前搜索的池ID如果有的话 "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({ return JsonResponse({
'code': 200, 'code': 200,
'message': '搜索成功', 'message': '搜索成功',
'data': { 'data': creator_list,
'creators': creator_list, 'pagination': pagination,
'pagination': pagination, 'search_info': search_info,
'search_info': search_info 'pool_info': pool_info
}
}, json_dumps_params={'ensure_ascii': False}) }, json_dumps_params={'ensure_ascii': False})
except Exception as e: except Exception as e: