diff --git a/apps/daren_detail/views.py b/apps/daren_detail/views.py index 18182de..755633d 100644 --- a/apps/daren_detail/views.py +++ b/apps/daren_detail/views.py @@ -1257,7 +1257,7 @@ def get_creator_followers_metrics(request, creator_id=None): """获取创作者的粉丝统计指标数据""" try: import json - from datetime import datetime + from datetime import datetime, timedelta # 检查creator_id是否提供 if not creator_id: @@ -1286,6 +1286,9 @@ def get_creator_followers_metrics(request, creator_id=None): if not follower_metrics: # 如果没有数据,返回示例数据 + from datetime import datetime, timedelta + end_date = datetime.now().date() + start_date = end_date - timedelta(days=30) follower_data = { 'gender': { 'female': 0, @@ -1305,10 +1308,7 @@ def get_creator_followers_metrics(request, creator_id=None): 'GE': 0, 'CA': 0 }, - 'date_range': { - 'start_date': '2025-03-29', - 'end_date': '2025-04-28' - } + 'date_range': f"{start_date.strftime('%b %d, %Y')} - {end_date.strftime('%b %d, %Y')}" } else: # 构建粉丝统计数据 @@ -1331,10 +1331,7 @@ def get_creator_followers_metrics(request, creator_id=None): '55+': round(follower_metrics.age_55_plus_percentage, 2) }, 'locations': processed_locations, - 'date_range': { - 'start_date': follower_metrics.start_date.strftime('%Y-%m-%d'), - 'end_date': follower_metrics.end_date.strftime('%Y-%m-%d') - } + 'date_range': f"{follower_metrics.start_date.strftime('%b %d, %Y')} - {follower_metrics.end_date.strftime('%b %d, %Y')}" } return JsonResponse({ @@ -1461,10 +1458,7 @@ def get_creator_trends(request, creator_id=None): base_views = views_value base_engagement = engagement_value - trend_data['date_range'] = { - 'start_date': example_date_range[0], - 'end_date': example_date_range[-1] - } + 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')}" else: # 从数据库构建趋势数据 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['dates'].append(trend.date.strftime('%Y-%m-%d')) - trend_data['date_range'] = { - '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') - } + 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')}" return JsonResponse({ 'code': 200, @@ -2040,6 +2031,45 @@ def get_public_creators(request): 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() @@ -2934,39 +2964,41 @@ def filter_public_creators(request): # 观看量范围过滤,单选 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 + 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) - - # 价格区间过滤逻辑,单选 - 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 - ) + 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() @@ -3165,39 +3197,74 @@ def filter_private_pool_creators(request): # 观看量范围过滤,单选 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 + 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()) + + creator_relations = creator_relations.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: - creator_relations = creator_relations.filter(creator__avg_video_views__gte=views_min) - if views_max < float('inf'): - creator_relations = creator_relations.filter(creator__avg_video_views__lte=views_max) + if views_min > 0: + creator_relations = creator_relations.filter(creator__avg_video_views__gte=views_min) + if views_max < float('inf'): + creator_relations = creator_relations.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) - # 修改:根据单一定价字段判断是否在区间内 - creator_relations = creator_relations.filter( - creator__pricing__gte=min_price, - creator__pricing__lte=max_price - ) + pricing_val = pricing[0] # 单选,取第一个值 + if ',' 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 + 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()