178 lines
9.6 KiB
Python
178 lines
9.6 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:
|
|||
|
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:
|
|||
|
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:
|
|||
|
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:
|
|||
|
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}"
|