182 lines
9.7 KiB
Python
182 lines
9.7 KiB
Python
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:
|
||
db_table = 'brands'
|
||
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, 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:
|
||
db_table = 'products'
|
||
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=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='活动图片')
|
||
|
||
# 活动相关字段
|
||
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, 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:
|
||
db_table = 'campaigns'
|
||
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']),
|
||
]
|
||
|
||
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:
|
||
db_table = 'brand_chat_sessions'
|
||
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}"
|