This commit is contained in:
jlj 2025-06-10 15:43:28 +08:00
parent 032a63ab39
commit 54ad21b952

View File

@ -37,183 +37,6 @@ monitor_thread = None
is_monitoring = False
@api_view(['POST'])
@authentication_classes([CustomTokenAuthentication])
@csrf_exempt
@require_http_methods(["POST"])
def filter_creators(request):
"""根据过滤条件筛选达人信息POST版分页参数在URL中"""
try:
import json
# 从URL获取分页参数
page = int(request.GET.get('page', 1))
page_size = 10 # 固定页面大小为10条数据
# 解析POST请求体
data = json.loads(request.body)
filter_data = data.get('filter', {})
# 基础查询
query = CreatorProfile.objects.all()
# Category 多选过滤
category = filter_data.get('category')
if category and len(category) > 0:
query = query.filter(category__in=category)
# 电商能力等级过滤 (L1-L7),多选
e_commerce_level = filter_data.get('e_commerce_level')
if e_commerce_level and len(e_commerce_level) > 0:
level_nums = []
for level_str in e_commerce_level:
if level_str.startswith('L'):
level_nums.append(int(level_str[1:]))
if level_nums:
query = query.filter(e_commerce_level__in=level_nums)
# 曝光等级过滤 (KOL-1, KOL-2, KOC-1等),多选
exposure_level = filter_data.get('exposure_level')
if exposure_level and len(exposure_level) > 0:
query = query.filter(exposure_level__in=exposure_level)
# GMV范围过滤 ($0-$5k, $5k-$25k, $25k-$50k等),多选
gmv_range = filter_data.get('gmv_range')
if gmv_range and len(gmv_range) > 0:
gmv_q = Q()
for gmv_val in gmv_range:
gmv_min, gmv_max = 0, float('inf')
if gmv_val == "$0-$5k":
gmv_min, gmv_max = 0, 5
elif gmv_val == "$5k-$25k":
gmv_min, gmv_max = 5, 25
elif gmv_val == "$25k-$50k":
gmv_min, gmv_max = 25, 50
elif gmv_val == "$50k-$150k":
gmv_min, gmv_max = 50, 150
elif gmv_val == "$150k-$400k":
gmv_min, gmv_max = 150, 400
elif gmv_val == "$400k-$1500k":
gmv_min, gmv_max = 400, 1500
elif gmv_val == "$1500k+":
gmv_min, gmv_max = 1500, float('inf')
range_q = Q()
if gmv_min > 0:
range_q &= Q(gmv__gte=gmv_min)
if gmv_max < float('inf'):
range_q &= Q(gmv__lte=gmv_max)
gmv_q |= range_q
query = query.filter(gmv_q)
# 观看量范围过滤,单选
views_range = filter_data.get('views_range')
if views_range and len(views_range) > 0:
views_min, views_max = 0, float('inf')
views_val = views_range[0]
if views_val == "0-100":
views_min, views_max = 0, 100
elif views_val == "1k-10k":
views_min, views_max = 1000, 10000
elif views_val == "10k-100k":
views_min, views_max = 10000, 100000
elif views_val == "100k-250k":
views_min, views_max = 100000, 250000
elif views_val == "250k-500k":
views_min, views_max = 250000, 500000
elif views_val == "500k+":
views_min = 500000
if views_min > 0:
query = query.filter(avg_video_views__gte=views_min)
if views_max < float('inf'):
query = query.filter(avg_video_views__lte=views_max)
# 价格区间过滤逻辑,单选
pricing = filter_data.get('pricing')
if pricing and len(pricing) > 0:
pricing_val = pricing[0]
if '-' in pricing_val:
min_price, max_price = pricing_val.split('-')
min_price = float(min_price)
max_price = float(max_price)
# 修改:根据单一定价字段判断是否在区间内
query = query.filter(pricing__gte=min_price, pricing__lte=max_price)
# 获取总数据量
total_count = query.count()
# 计算分页
start = (page - 1) * page_size
end = start + page_size
# 执行查询并分页
creators = query[start:end]
creator_list = []
for creator in creators:
# 格式化电商等级
e_commerce_level_formatted = f"L{creator.e_commerce_level}" if creator.e_commerce_level else None
# 格式化GMV
gmv_formatted = f"${creator.gmv}k" if creator.gmv 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"
# 格式化价格
pricing_formatted = f"${creator.pricing}" if creator.pricing else None
# 格式化结果
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_list.append(formatted_creator)
# 计算总页数
total_pages = (total_count + page_size - 1) // page_size
# 修改响应格式为code、message和data
return JsonResponse({
'code': 200,
'message': '获取成功',
'data': {
'total_count': total_count,
'total_pages': total_pages,
'current_page': page,
'page_size': page_size,
'count': len(creator_list),
'creators': creator_list
}
}, 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})
@api_view(['POST'])
@authentication_classes([CustomTokenAuthentication])