修改
This commit is contained in:
parent
032a63ab39
commit
54ad21b952
@ -37,183 +37,6 @@ monitor_thread = None
|
|||||||
is_monitoring = False
|
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'])
|
@api_view(['POST'])
|
||||||
@authentication_classes([CustomTokenAuthentication])
|
@authentication_classes([CustomTokenAuthentication])
|
||||||
|
Loading…
Reference in New Issue
Block a user