From bd2d2eb3587da9fae87943d57463f5887eb1e3d0 Mon Sep 17 00:00:00 2001 From: Fam Zheng Date: Sat, 23 Aug 2025 21:40:00 +0100 Subject: [PATCH] models: Add chat tables --- .../0105_chatsession_chatmessage.py | 37 +++++++++++++++++++ api/products/models.py | 31 +++++++++++++++- 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 api/products/migrations/0105_chatsession_chatmessage.py diff --git a/api/products/migrations/0105_chatsession_chatmessage.py b/api/products/migrations/0105_chatsession_chatmessage.py new file mode 100644 index 0000000..387b23f --- /dev/null +++ b/api/products/migrations/0105_chatsession_chatmessage.py @@ -0,0 +1,37 @@ +# Generated by Django 4.2.23 on 2025-08-23 20:39 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('products', '0104_alter_datalabel_name'), + ] + + operations = [ + migrations.CreateModel( + name='ChatSession', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('session_id', models.CharField(db_index=True, max_length=128, unique=True, verbose_name='会话ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('consumer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chat_sessions', to='products.consumerinfo', verbose_name='消费者')), + ('tenant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chat_sessions', to='products.tenant', verbose_name='租户')), + ], + ), + migrations.CreateModel( + name='ChatMessage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('role', models.CharField(choices=[('user', '用户'), ('assistant', '助手'), ('system', '系统')], max_length=20, verbose_name='角色')), + ('message_type', models.CharField(choices=[('text', '文本'), ('image', '图片'), ('file', '文件'), ('system', '系统消息'), ('ai_response', 'AI回复')], default='text', max_length=20, verbose_name='消息类型')), + ('text_content', models.TextField(verbose_name='消息内容')), + ('file_oss_bucket', models.TextField(blank=True, null=True, verbose_name='文件OSS桶')), + ('file_oss_path', models.TextField(blank=True, null=True, verbose_name='文件OSS路径')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='发送时间')), + ('session', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='products.chatsession', verbose_name='会话')), + ], + ), + ] diff --git a/api/products/models.py b/api/products/models.py index 9c3c363..dd9b3a0 100644 --- a/api/products/models.py +++ b/api/products/models.py @@ -441,4 +441,33 @@ class DataLabel(models.Model): description = models.TextField(verbose_name="描述") def __str__(self): - return f"{self.name}: created {self.create_time} updated {self.update_time}" \ No newline at end of file + return f"{self.name}: created {self.create_time} updated {self.update_time}" + +class ChatSession(models.Model): + session_id = models.CharField(max_length=128, unique=True, db_index=True, verbose_name="会话ID") + tenant = models.ForeignKey(Tenant, related_name="chat_sessions", null=True, blank=True, on_delete=models.CASCADE, verbose_name="租户") + consumer = models.ForeignKey(ConsumerInfo, related_name="chat_sessions", null=True, blank=True, on_delete=models.CASCADE, verbose_name="消费者") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + +class ChatMessage(models.Model): + MESSAGE_TYPE_CHOICES = [ + ('text', '文本'), + ('image', '图片'), + ('file', '文件'), + ('system', '系统消息'), + ('ai_response', 'AI回复'), + ] + + ROLE_CHOICES = [ + ('user', '用户'), + ('assistant', '助手'), + ('system', '系统'), + ] + + session = models.ForeignKey(ChatSession, related_name="messages", on_delete=models.CASCADE, verbose_name="会话") + role = models.CharField(max_length=20, choices=ROLE_CHOICES, verbose_name="角色") + message_type = models.CharField(max_length=20, choices=MESSAGE_TYPE_CHOICES, default='text', verbose_name="消息类型") + text_content = models.TextField(verbose_name="消息内容") + file_oss_bucket = models.TextField(null=True, blank=True, verbose_name="文件OSS桶") + file_oss_path = models.TextField(null=True, blank=True, verbose_name="文件OSS路径") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="发送时间") \ No newline at end of file