daren/apps/daren_detail/migrations/0001_initial.py
2025-05-29 17:26:37 +08:00

295 lines
23 KiB
Python

# Generated by Django 5.2.1 on 2025-05-29 09:24
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('brands', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='CreatorProfile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='达人名称')),
('avatar', models.ImageField(blank=True, null=True, upload_to='avatars/', verbose_name='头像图片')),
('avatar_url', models.TextField(blank=True, null=True, verbose_name='头像URL')),
('platform_id', models.CharField(blank=True, max_length=255, null=True, verbose_name='Platform ID')),
('email', models.EmailField(blank=True, max_length=255, null=True, verbose_name='电子邮箱')),
('instagram', models.CharField(blank=True, max_length=255, null=True, verbose_name='Instagram账号')),
('location', models.CharField(blank=True, max_length=100, null=True, verbose_name='位置')),
('live_schedule', models.CharField(blank=True, max_length=255, null=True, verbose_name='直播时间表')),
('profile', models.CharField(choices=[('tiktok', 'TikTok'), ('instagram', 'Instagram'), ('youtube', 'YouTube'), ('other', '其他平台')], default='tiktok', max_length=20, verbose_name='达人平台')),
('hashtags', models.TextField(blank=True, help_text='以#分隔的标签,例如:#fashion#beauty#lifestyle', null=True, verbose_name='标签')),
('trends', models.TextField(blank=True, help_text='创作者相关的趋势关键词', null=True, verbose_name='趋势')),
('region', models.CharField(blank=True, max_length=100, null=True, verbose_name='地区')),
('tiktok_link', models.URLField(blank=True, max_length=500, null=True, verbose_name='主页链接')),
('us_creator_level', models.CharField(blank=True, max_length=50, null=True, verbose_name='对标美区达人等级')),
('price_gbp', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='报价(英镑)')),
('price_usd', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='报价(美金)')),
('gmv_gbp', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True, verbose_name='GMV(英镑)')),
('link', models.URLField(blank=True, max_length=500, null=True, verbose_name='链接')),
('category', models.CharField(blank=True, choices=[('Phones & Electronics', '手机与电子产品'), ('Homes Supplies', '家居用品'), ('Kitchenware', '厨房用品'), ('Textiles & Soft Furnishings', '纺织品和软装'), ('Household Appliances', '家用电器'), ('Womenswear & Underwear', '女装和内衣'), ('Muslim Fashion', '穆斯林时尚'), ('Shoes', '鞋类'), ('Beauty & Personal Care', '美容和个人护理'), ('Computers & Office Equipment', '电脑和办公设备'), ('Pet Supplies', '宠物用品'), ('Baby & Maternity', '婴儿和孕妇用品'), ('Sports & Outdoor', '运动和户外'), ('Toys', '玩具'), ('Furniture', '家具'), ('Tools & Hardware', '工具和硬件'), ('Home Improvement', '家居装修'), ('Automotive & Motorcycle', '汽车和摩托车'), ('Fashion Accessories', '时尚配饰'), ('Food & Beverages', '食品和饮料'), ('Health', '健康'), ('Books, Magazines & Audio', '书籍、杂志和音频'), ('Kids Fashion', '儿童时尚'), ('Menswear & Underwear', '男装和内衣'), ('Luggage & Bags', '行李和包'), ('Pre-Owned Collections', '二手收藏'), ('Jewellery Accessories & Derivatives', '珠宝配饰及衍生品')], max_length=100, null=True, verbose_name='类别')),
('e_commerce_level', models.IntegerField(blank=True, choices=[(1, 'L1'), (2, 'L2'), (3, 'L3'), (4, 'L4'), (5, 'L5'), (6, 'L6'), (7, 'L7')], null=True, verbose_name='电商能力等级')),
('exposure_level', models.CharField(blank=True, choices=[('KOC-1', 'KOC-1'), ('KOC-2', 'KOC-2'), ('KOL-1', 'KOL-1'), ('KOL-2', 'KOL-2'), ('KOL-3', 'KOL-3')], max_length=10, null=True, verbose_name='曝光等级')),
('followers', models.IntegerField(default=0, verbose_name='粉丝数')),
('gmv', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True, verbose_name='GMV(千美元)')),
('items_sold', models.DecimalField(blank=True, decimal_places=2, max_digits=12, null=True, verbose_name='售出商品数量')),
('avg_video_views', models.IntegerField(blank=True, default=0, null=True, verbose_name='平均视频浏览量')),
('pricing', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='个人定价')),
('pricing_package', models.CharField(blank=True, max_length=100, null=True, verbose_name='套餐定价')),
('collab_count', models.IntegerField(blank=True, default=0, null=True, verbose_name='合作次数')),
('latest_collab', models.CharField(blank=True, max_length=100, null=True, verbose_name='最新合作')),
('e_commerce_platforms', models.JSONField(blank=True, null=True, verbose_name='电商平台')),
('gmv_by_channel', models.JSONField(blank=True, null=True, verbose_name='GMV按渠道分布')),
('gmv_by_category', models.JSONField(blank=True, null=True, verbose_name='GMV按类别分布')),
('mcn', models.CharField(blank=True, max_length=255, null=True, verbose_name='MCN机构')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '达人信息',
'verbose_name_plural': '达人信息',
'db_table': 'creator_profiles',
},
),
migrations.CreateModel(
name='BrandCampaign',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('brand_id', models.CharField(choices=[('U', 'U品牌'), ('R', 'R品牌'), ('X', 'X品牌'), ('Q', 'Q品牌'), ('A', 'A品牌'), ('M', 'M品牌')], max_length=10, verbose_name='品牌ID')),
('brand_name', models.CharField(default='brand', max_length=255, verbose_name='品牌名称')),
('brand_color', models.CharField(default='#000000', max_length=20, verbose_name='品牌颜色')),
('pricing_detail', models.CharField(max_length=50, verbose_name='价格详情')),
('start_date', models.DateField(verbose_name='开始日期')),
('end_date', models.DateField(verbose_name='结束日期')),
('status', models.CharField(choices=[('completed', '已完成'), ('in_progress', '进行中'), ('rejected', '已拒绝')], max_length=20, verbose_name='状态')),
('gmv_achieved', models.CharField(max_length=50, verbose_name='实现GMV')),
('views_achieved', models.CharField(max_length=50, verbose_name='实现观看量')),
('video_link', models.URLField(blank=True, max_length=255, null=True, verbose_name='视频链接')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('campaign', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='brand_campaigns', to='brands.campaign', verbose_name='关联活动')),
],
options={
'verbose_name': '品牌活动数据',
'verbose_name_plural': '品牌活动数据',
'db_table': 'brand_campaigns',
},
),
migrations.CreateModel(
name='CollaborationMetrics',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('avg_commission_rate', models.DecimalField(decimal_places=2, max_digits=5, verbose_name='平均佣金率(%)')),
('products_count', models.IntegerField(verbose_name='产品数量')),
('brand_collaborations', models.IntegerField(verbose_name='品牌合作数量')),
('min_product_price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='最低产品价格($)')),
('max_product_price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='最高产品价格($)')),
('start_date', models.DateField(verbose_name='开始日期')),
('end_date', models.DateField(verbose_name='结束日期')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='collaboration_metrics', to='daren_detail.creatorprofile', verbose_name='创作者')),
],
options={
'verbose_name': '协作指标',
'verbose_name_plural': '协作指标',
'db_table': 'collaboration_metrics',
},
),
migrations.CreateModel(
name='CreatorVideo',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255, verbose_name='视频标题')),
('description', models.TextField(blank=True, null=True, verbose_name='视频描述')),
('thumbnail_url', models.URLField(blank=True, max_length=500, null=True, verbose_name='缩略图URL')),
('video_url', models.URLField(blank=True, max_length=500, null=True, verbose_name='视频URL')),
('video_id', models.CharField(max_length=100, verbose_name='视频ID')),
('video_type', models.CharField(choices=[('regular', '普通视频'), ('product', '带产品视频')], default='regular', max_length=20, verbose_name='视频类型')),
('badge', models.CharField(blank=True, choices=[('red', '红色标记'), ('gold', '金色标记')], max_length=20, null=True, verbose_name='视频标记')),
('view_count', models.IntegerField(default=0, verbose_name='观看次数')),
('like_count', models.IntegerField(default=0, verbose_name='点赞数')),
('comment_count', models.IntegerField(default=0, verbose_name='评论数')),
('has_product', models.BooleanField(default=False, verbose_name='是否有产品')),
('product_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='产品名称')),
('product_url', models.URLField(blank=True, max_length=500, null=True, verbose_name='产品链接')),
('release_date', models.DateField(verbose_name='发布日期')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='videos', to='daren_detail.creatorprofile')),
],
options={
'verbose_name': '创作者视频',
'verbose_name_plural': '创作者视频',
},
),
migrations.CreateModel(
name='FollowerMetrics',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('start_date', models.DateField()),
('end_date', models.DateField()),
('female_percentage', models.FloatField(default=0)),
('male_percentage', models.FloatField(default=0)),
('age_18_24_percentage', models.FloatField(default=0)),
('age_25_34_percentage', models.FloatField(default=0)),
('age_35_44_percentage', models.FloatField(default=0)),
('age_45_54_percentage', models.FloatField(default=0)),
('age_55_plus_percentage', models.FloatField(default=0)),
('location_data', models.JSONField(default=dict)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='follower_metrics', to='daren_detail.creatorprofile')),
],
options={
'verbose_name': '粉丝统计',
'verbose_name_plural': '粉丝统计',
},
),
migrations.CreateModel(
name='PrivateCreatorPool',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='私有库名称')),
('description', models.TextField(blank=True, null=True, verbose_name='描述')),
('is_default', models.BooleanField(default=False, verbose_name='是否为默认库')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('user', models.ForeignKey(db_column='user_id', on_delete=django.db.models.deletion.CASCADE, related_name='private_creators', to=settings.AUTH_USER_MODEL, verbose_name='用户')),
],
options={
'verbose_name': '私有达人库',
'verbose_name_plural': '私有达人库',
'db_table': 'private_creator_pool',
'unique_together': {('user', 'name')},
},
),
migrations.CreateModel(
name='PublicCreatorPool',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('category', models.CharField(blank=True, max_length=255, null=True, verbose_name='分类')),
('remark', models.TextField(blank=True, null=True, verbose_name='备注')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='public_pool', to='daren_detail.creatorprofile', verbose_name='达人')),
],
options={
'verbose_name': '公有达人库',
'verbose_name_plural': '公有达人库',
'db_table': 'public_creator_pool',
},
),
migrations.CreateModel(
name='TrendMetrics',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('date', models.DateField()),
('gmv', models.FloatField(default=0)),
('items_sold', models.IntegerField(default=0)),
('followers_count', models.IntegerField(default=0)),
('video_views', models.IntegerField(default=0)),
('engagement_rate', models.FloatField(default=0)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='trend_metrics', to='daren_detail.creatorprofile')),
],
options={
'verbose_name': '趋势指标',
'verbose_name_plural': '趋势指标',
},
),
migrations.CreateModel(
name='CreatorCampaign',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('status', models.CharField(choices=[('pending', '待处理'), ('accepted', '已接受'), ('rejected', '已拒绝'), ('completed', '已完成')], default='pending', max_length=20, verbose_name='状态')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('campaign', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='creators', to='brands.campaign', verbose_name='活动')),
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='campaigns', to='daren_detail.creatorprofile', verbose_name='达人')),
],
options={
'verbose_name': '达人活动关联',
'verbose_name_plural': '达人活动关联',
'db_table': 'creator_campaigns',
'unique_together': {('creator', 'campaign')},
},
),
migrations.CreateModel(
name='LiveMetrics',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('live_type', models.CharField(choices=[('regular', '普通直播'), ('shoppable', '可购物直播')], default='regular', max_length=50, verbose_name='直播类型')),
('gpm', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='直播GPM($)')),
('lives_count', models.IntegerField(verbose_name='直播数量')),
('avg_views', models.DecimalField(decimal_places=2, max_digits=12, verbose_name='平均观看量')),
('avg_engagement', models.DecimalField(decimal_places=2, max_digits=5, verbose_name='平均互动率(%)')),
('avg_likes', models.IntegerField(verbose_name='平均点赞数')),
('start_date', models.DateField(verbose_name='开始日期')),
('end_date', models.DateField(verbose_name='结束日期')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='live_metrics', to='daren_detail.creatorprofile', verbose_name='创作者')),
],
options={
'verbose_name': '直播指标',
'verbose_name_plural': '直播指标',
'db_table': 'live_metrics',
'unique_together': {('creator', 'live_type', 'start_date', 'end_date')},
},
),
migrations.CreateModel(
name='PrivateCreatorRelation',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('added_from_public', models.BooleanField(default=True, verbose_name='是否从公有库添加')),
('notes', models.TextField(blank=True, null=True, verbose_name='笔记')),
('status', models.CharField(choices=[('active', '活跃'), ('archived', '已归档'), ('favorite', '收藏'), ('public_removed', '公有库已移除')], default='active', max_length=20, verbose_name='状态')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='添加时间')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='private_pool_relations', to='daren_detail.creatorprofile', verbose_name='达人')),
('private_pool', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='creator_relations', to='daren_detail.privatecreatorpool', verbose_name='私有达人库')),
],
options={
'verbose_name': '私有库达人关联',
'verbose_name_plural': '私有库达人关联',
'db_table': 'private_creator_relations',
'unique_together': {('private_pool', 'creator')},
},
),
migrations.CreateModel(
name='VideoMetrics',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('video_type', models.CharField(choices=[('regular', '普通视频'), ('shoppable', '可购物视频')], default='regular', max_length=50, verbose_name='视频类型')),
('gpm', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='视频GPM($)')),
('videos_count', models.IntegerField(verbose_name='视频数量')),
('avg_views', models.DecimalField(decimal_places=2, max_digits=12, verbose_name='平均观看量')),
('avg_engagement', models.DecimalField(decimal_places=2, max_digits=5, verbose_name='平均互动率(%)')),
('avg_likes', models.IntegerField(verbose_name='平均点赞数')),
('start_date', models.DateField(verbose_name='开始日期')),
('end_date', models.DateField(verbose_name='结束日期')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='video_metrics', to='daren_detail.creatorprofile', verbose_name='创作者')),
],
options={
'verbose_name': '视频指标',
'verbose_name_plural': '视频指标',
'db_table': 'video_metrics',
'unique_together': {('creator', 'video_type', 'start_date', 'end_date')},
},
),
]