daren/apps/brands/models.py
2025-05-30 11:49:59 +08:00

196 lines
11 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.db import models
import uuid
from django.utils import timezone
class Brand(models.Model):
"""品牌模型"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=100, unique=True, verbose_name='品牌名称')
description = models.TextField(blank=True, null=True, verbose_name='品牌描述')
logo_url = models.CharField(max_length=255, blank=True, null=True, verbose_name='品牌Logo')
category = models.CharField(max_length=100, blank=True, null=True, verbose_name='品牌分类')
source = models.CharField(max_length=100, blank=True, null=True, verbose_name='来源')
collab_count = models.IntegerField(default=0, verbose_name='合作数量')
creators_count = models.IntegerField(default=0, verbose_name='创作者数量')
campaign_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='活动ID')
# 添加数据统计字段
total_gmv_achieved = models.DecimalField(max_digits=12, decimal_places=2, default=0, verbose_name='总GMV')
total_views_achieved = models.DecimalField(max_digits=12, decimal_places=2, default=0, verbose_name='总浏览量')
shop_overall_rating = models.DecimalField(max_digits=3, decimal_places=1, default=0.0, verbose_name='店铺评分')
# 存储关联到此品牌的所有产品和活动知识库ID列表
dataset_id_list = models.JSONField(default=list, blank=True, verbose_name='知识库ID列表',
help_text='所有关联的知识库ID列表')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
is_active = models.BooleanField(default=True, verbose_name='是否激活')
class Meta:
verbose_name = '品牌'
verbose_name_plural = '品牌'
def __str__(self):
return self.name
class Product(models.Model):
"""产品模型 - 作为一个知识库"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
brand = models.ForeignKey(Brand, on_delete=models.CASCADE, related_name='products', verbose_name='所属品牌')
name = models.CharField(max_length=100, verbose_name='产品名称')
description = models.TextField(blank=True, null=True, verbose_name='产品描述')
image_url = models.CharField(max_length=255, blank=True, null=True, verbose_name='产品图片')
# 添加产品详情字段
pid = models.CharField(max_length=100, blank=True, null=True, verbose_name='产品ID')
commission_rate = models.DecimalField(max_digits=5, decimal_places=2, default=0, verbose_name='佣金率')
open_collab = models.DecimalField(max_digits=5, decimal_places=2, default=0, verbose_name='开放合作率')
available_samples = models.IntegerField(default=0, verbose_name='可用样品数')
sales_price_min = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='最低销售价')
sales_price_max = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='最高销售价')
stock = models.IntegerField(default=0, verbose_name='库存')
items_sold = models.IntegerField(default=0, verbose_name='已售数量')
product_rating = models.DecimalField(max_digits=3, decimal_places=1, default=0, verbose_name='产品评分')
reviews_count = models.IntegerField(default=0, verbose_name='评价数量')
collab_creators = models.IntegerField(default=0, verbose_name='合作创作者数')
tiktok_shop = models.BooleanField(default=False, verbose_name='是否TikTok商店')
dataset_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='知识库ID',
help_text='外部知识库系统中的ID')
external_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='外部ID',
help_text='外部系统中的唯一标识')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
is_active = models.BooleanField(default=True, verbose_name='是否激活')
class Meta:
verbose_name = '产品'
verbose_name_plural = '产品'
unique_together = ['brand', 'name']
indexes = [
models.Index(fields=['brand']),
models.Index(fields=['dataset_id']),
models.Index(fields=['is_active']),
models.Index(fields=['pid']),
]
def __str__(self):
return f"{self.brand.name} - {self.name}"
def save(self, *args, **kwargs):
"""重写save方法更新品牌的dataset_id_list"""
is_new = self.pk is None
super().save(*args, **kwargs)
# 刷新品牌的dataset_id_list
if is_new and self.is_active and self.dataset_id:
brand = self.brand
if self.dataset_id not in brand.dataset_id_list:
brand.dataset_id_list.append(self.dataset_id)
brand.save(update_fields=['dataset_id_list', 'updated_at'])
class Campaign(models.Model):
"""活动模型 - 合并后的完整模型"""
# id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
brand = models.ForeignKey(Brand, on_delete=models.CASCADE, related_name='campaigns', verbose_name='所属品牌')
name = models.CharField(max_length=255, verbose_name='活动名称')
description = models.TextField(blank=True, null=True, verbose_name='活动描述')
image_url = models.CharField(max_length=255, blank=True, null=True, verbose_name='活动图片')
# 活动相关字段
service = models.CharField(max_length=100, blank=True, null=True, verbose_name='服务类型')
creator_type = models.CharField(max_length=100, blank=True, null=True, verbose_name='创作者类型')
creator_level = models.CharField(max_length=100, blank=True, null=True, verbose_name='创作者等级')
creator_category = models.CharField(max_length=100, blank=True, null=True, verbose_name='创作者分类')
creators_count = models.IntegerField(default=0, verbose_name='创作者数量')
gmv = models.CharField(max_length=100, blank=True, null=True, verbose_name='GMV范围')
followers = models.CharField(max_length=100, blank=True, null=True, verbose_name='粉丝数范围')
views = models.CharField(max_length=100, blank=True, null=True, verbose_name='浏览量范围')
budget = models.CharField(max_length=100, blank=True, null=True, verbose_name='预算范围')
link_product = models.ManyToManyField(Product, blank=True, related_name='campaigns', verbose_name='关联产品')
# 时间信息
start_date = models.DateTimeField(blank=True, null=True, verbose_name='开始日期')
end_date = models.DateTimeField(blank=True, null=True, verbose_name='结束日期')
# 知识库信息
dataset_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='知识库ID',
help_text='外部知识库系统中的ID')
external_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='外部ID',
help_text='外部系统中的唯一标识')
# 状态信息
status = models.CharField(max_length=20, default='pending', verbose_name='状态',
choices=[
('pending', '待处理'),
('accepted', '已接受'),
('rejected', '已拒绝'),
('completed', '已完成'),
('in_progress', '进行中')
])
# 统计信息
gmv_achieved = models.CharField(max_length=50, blank=True, null=True, verbose_name='实现GMV')
views_achieved = models.CharField(max_length=50, blank=True, null=True, verbose_name='实现观看量')
video_link = models.URLField(max_length=255, 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='更新时间')
is_active = models.BooleanField(default=True, verbose_name='是否激活')
class Meta:
verbose_name = '活动'
verbose_name_plural = '活动'
unique_together = ['brand', 'name']
indexes = [
models.Index(fields=['brand']),
models.Index(fields=['dataset_id']),
models.Index(fields=['is_active']),
models.Index(fields=['start_date']),
models.Index(fields=['end_date']),
models.Index(fields=['status']),
]
def __str__(self):
return f"{self.brand.name} - {self.name}"
def save(self, *args, **kwargs):
"""重写save方法更新品牌的dataset_id_list"""
is_new = self.pk is None
super().save(*args, **kwargs)
# 刷新品牌的dataset_id_list
if is_new and self.is_active and self.dataset_id:
brand = self.brand
if self.dataset_id not in brand.dataset_id_list:
brand.dataset_id_list.append(self.dataset_id)
brand.save(update_fields=['dataset_id_list', 'updated_at'])
class BrandChatSession(models.Model):
"""品牌聊天会话模型"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
brand = models.ForeignKey(Brand, on_delete=models.CASCADE, related_name='chat_sessions', verbose_name='品牌')
session_id = models.CharField(max_length=100, unique=True, verbose_name='会话ID')
title = models.CharField(max_length=200, default='新对话', verbose_name='会话标题')
# 存储此次会话使用的所有知识库ID
dataset_id_list = models.JSONField(default=list, blank=True, verbose_name='知识库ID列表')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
is_active = models.BooleanField(default=True, verbose_name='是否激活')
class Meta:
verbose_name = '品牌聊天会话'
verbose_name_plural = '品牌聊天会话'
indexes = [
models.Index(fields=['brand']),
models.Index(fields=['session_id']),
models.Index(fields=['created_at']),
]
def __str__(self):
return f"{self.brand.name} - {self.title}"