Merge branch 'main' of http://180.163.88.62:56421/J/daren into main

This commit is contained in:
Zixiao Wang 2025-05-26 10:38:18 +08:00
commit 0ee00d00a9

View File

@ -1257,7 +1257,7 @@ def get_creator_followers_metrics(request, creator_id=None):
"""获取创作者的粉丝统计指标数据""" """获取创作者的粉丝统计指标数据"""
try: try:
import json import json
from datetime import datetime from datetime import datetime, timedelta
# 检查creator_id是否提供 # 检查creator_id是否提供
if not creator_id: if not creator_id:
@ -1286,6 +1286,9 @@ def get_creator_followers_metrics(request, creator_id=None):
if not follower_metrics: if not follower_metrics:
# 如果没有数据,返回示例数据 # 如果没有数据,返回示例数据
from datetime import datetime, timedelta
end_date = datetime.now().date()
start_date = end_date - timedelta(days=30)
follower_data = { follower_data = {
'gender': { 'gender': {
'female': 0, 'female': 0,
@ -1305,10 +1308,7 @@ def get_creator_followers_metrics(request, creator_id=None):
'GE': 0, 'GE': 0,
'CA': 0 'CA': 0
}, },
'date_range': { 'date_range': f"{start_date.strftime('%b %d, %Y')} - {end_date.strftime('%b %d, %Y')}"
'start_date': '2025-03-29',
'end_date': '2025-04-28'
}
} }
else: else:
# 构建粉丝统计数据 # 构建粉丝统计数据
@ -1331,10 +1331,7 @@ def get_creator_followers_metrics(request, creator_id=None):
'55+': round(follower_metrics.age_55_plus_percentage, 2) '55+': round(follower_metrics.age_55_plus_percentage, 2)
}, },
'locations': processed_locations, 'locations': processed_locations,
'date_range': { 'date_range': f"{follower_metrics.start_date.strftime('%b %d, %Y')} - {follower_metrics.end_date.strftime('%b %d, %Y')}"
'start_date': follower_metrics.start_date.strftime('%Y-%m-%d'),
'end_date': follower_metrics.end_date.strftime('%Y-%m-%d')
}
} }
return JsonResponse({ return JsonResponse({
@ -1461,10 +1458,7 @@ def get_creator_trends(request, creator_id=None):
base_views = views_value base_views = views_value
base_engagement = engagement_value base_engagement = engagement_value
trend_data['date_range'] = { trend_data['date_range'] = f"{datetime.strptime(example_date_range[0], '%Y-%m-%d').strftime('%b %d, %Y')} - {datetime.strptime(example_date_range[-1], '%Y-%m-%d').strftime('%b %d, %Y')}"
'start_date': example_date_range[0],
'end_date': example_date_range[-1]
}
else: else:
# 从数据库构建趋势数据 # 从数据库构建趋势数据
trend_data = { trend_data = {
@ -1484,10 +1478,7 @@ def get_creator_trends(request, creator_id=None):
trend_data['engagement_rate'].append(round(trend.engagement_rate, 2)) trend_data['engagement_rate'].append(round(trend.engagement_rate, 2))
trend_data['dates'].append(trend.date.strftime('%Y-%m-%d')) trend_data['dates'].append(trend.date.strftime('%Y-%m-%d'))
trend_data['date_range'] = { trend_data['date_range'] = f"{datetime.strptime(trend_data['dates'][0], '%Y-%m-%d').strftime('%b %d, %Y')} - {datetime.strptime(trend_data['dates'][-1], '%Y-%m-%d').strftime('%b %d, %Y')}"
'start_date': trend_data['dates'][0] if trend_data['dates'] else start_date.strftime('%Y-%m-%d'),
'end_date': trend_data['dates'][-1] if trend_data['dates'] else end_date.strftime('%Y-%m-%d')
}
return JsonResponse({ return JsonResponse({
'code': 200, 'code': 200,
@ -2040,6 +2031,45 @@ def get_public_creators(request):
creator__category__icontains=keyword creator__category__icontains=keyword
) )
# 观看量范围过滤,单选
views_range = request.GET.get('views_range')
if views_range and len(views_range) > 0:
views_val = views_range[0] # 单选,取第一个值
if ',' in views_val:
# 新格式: "1000,10000"
try:
views_min, views_max = views_val.split(',')
views_min = int(views_min.strip())
views_max = int(views_max.strip())
public_creators = public_creators.filter(
creator__avg_video_views__gte=views_min,
creator__avg_video_views__lte=views_max
)
except (ValueError, IndexError):
# 如果解析失败,忽略此过滤条件
pass
else:
# 兼容旧格式,保持原有逻辑
views_min, views_max = 0, float('inf')
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:
public_creators = public_creators.filter(creator__avg_video_views__gte=views_min)
if views_max < float('inf'):
public_creators = public_creators.filter(creator__avg_video_views__lte=views_max)
# 获取总数据量 # 获取总数据量
total_count = public_creators.count() total_count = public_creators.count()
@ -2934,39 +2964,41 @@ def filter_public_creators(request):
# 观看量范围过滤,单选 # 观看量范围过滤,单选
views_range = filter_data.get('views_range') views_range = filter_data.get('views_range')
if views_range and len(views_range) > 0: if views_range and len(views_range) > 0:
views_min, views_max = 0, float('inf') views_val = views_range[0] # 单选,取第一个值
views_val = views_range[0] if ',' in views_val:
if views_val == "0-100": # 新格式: "1000,10000"
views_min, views_max = 0, 100 try:
elif views_val == "1k-10k": views_min, views_max = views_val.split(',')
views_min, views_max = 1000, 10000 views_min = int(views_min.strip())
elif views_val == "10k-100k": views_max = int(views_max.strip())
views_min, views_max = 10000, 100000
elif views_val == "100k-250k": public_creators = public_creators.filter(
views_min, views_max = 100000, 250000 creator__avg_video_views__gte=views_min,
elif views_val == "250k-500k": creator__avg_video_views__lte=views_max
views_min, views_max = 250000, 500000 )
elif views_val == "500k+": except (ValueError, IndexError):
views_min = 500000 # 如果解析失败,忽略此过滤条件
pass
else:
# 兼容旧格式,保持原有逻辑
views_min, views_max = 0, float('inf')
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: if views_min > 0:
public_creators = public_creators.filter(creator__avg_video_views__gte=views_min) public_creators = public_creators.filter(creator__avg_video_views__gte=views_min)
if views_max < float('inf'): if views_max < float('inf'):
public_creators = public_creators.filter(creator__avg_video_views__lte=views_max) public_creators = public_creators.filter(creator__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)
# 修改:根据单一定价字段判断是否在区间内
public_creators = public_creators.filter(
creator__pricing__gte=min_price,
creator__pricing__lte=max_price
)
# 获取总数据量 # 获取总数据量
total_count = public_creators.count() total_count = public_creators.count()
@ -3165,39 +3197,74 @@ def filter_private_pool_creators(request):
# 观看量范围过滤,单选 # 观看量范围过滤,单选
views_range = filter_data.get('views_range') views_range = filter_data.get('views_range')
if views_range and len(views_range) > 0: if views_range and len(views_range) > 0:
views_min, views_max = 0, float('inf') views_val = views_range[0] # 单选,取第一个值
views_val = views_range[0] if ',' in views_val:
if views_val == "0-100": # 新格式: "1000,10000"
views_min, views_max = 0, 100 try:
elif views_val == "1k-10k": views_min, views_max = views_val.split(',')
views_min, views_max = 1000, 10000 views_min = int(views_min.strip())
elif views_val == "10k-100k": views_max = int(views_max.strip())
views_min, views_max = 10000, 100000
elif views_val == "100k-250k": creator_relations = creator_relations.filter(
views_min, views_max = 100000, 250000 creator__avg_video_views__gte=views_min,
elif views_val == "250k-500k": creator__avg_video_views__lte=views_max
views_min, views_max = 250000, 500000 )
elif views_val == "500k+": except (ValueError, IndexError):
views_min = 500000 # 如果解析失败,忽略此过滤条件
pass
else:
# 兼容旧格式,保持原有逻辑
views_min, views_max = 0, float('inf')
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: if views_min > 0:
creator_relations = creator_relations.filter(creator__avg_video_views__gte=views_min) creator_relations = creator_relations.filter(creator__avg_video_views__gte=views_min)
if views_max < float('inf'): if views_max < float('inf'):
creator_relations = creator_relations.filter(creator__avg_video_views__lte=views_max) creator_relations = creator_relations.filter(creator__avg_video_views__lte=views_max)
# 价格区间过滤逻辑,单选 # 价格区间过滤逻辑,单选
pricing = filter_data.get('pricing') pricing = filter_data.get('pricing')
if pricing and len(pricing) > 0: if pricing and len(pricing) > 0:
pricing_val = pricing[0] pricing_val = pricing[0] # 单选,取第一个值
if '-' in pricing_val: if ',' in pricing_val:
min_price, max_price = pricing_val.split('-') # 新格式: "100,500"
min_price = float(min_price) try:
max_price = float(max_price) min_price, max_price = pricing_val.split(',')
# 修改:根据单一定价字段判断是否在区间内 min_price = float(min_price.strip())
creator_relations = creator_relations.filter( max_price = float(max_price.strip())
creator__pricing__gte=min_price,
creator__pricing__lte=max_price creator_relations = creator_relations.filter(
) creator__pricing__gte=min_price,
creator__pricing__lte=max_price
)
except (ValueError, IndexError):
# 如果解析失败,忽略此过滤条件
pass
elif '-' in pricing_val:
# 兼容旧格式: "100-500"
try:
min_price, max_price = pricing_val.split('-')
min_price = float(min_price.strip())
max_price = float(max_price.strip())
creator_relations = creator_relations.filter(
creator__pricing__gte=min_price,
creator__pricing__lte=max_price
)
except (ValueError, IndexError):
# 如果解析失败,忽略此过滤条件
pass
# 获取总数据量 # 获取总数据量
total_count = creator_relations.count() total_count = creator_relations.count()