diff --git a/apps/daren_detail/views.py b/apps/daren_detail/views.py index ccf8e0e..3baed22 100644 --- a/apps/daren_detail/views.py +++ b/apps/daren_detail/views.py @@ -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: