From ea56fd6212a486486b72d1ebd39fde425168e074 Mon Sep 17 00:00:00 2001 From: CaptainB Date: Mon, 14 Jul 2025 11:54:19 +0800 Subject: [PATCH] feat: add db_index to various fields for improved query performance --- apps/application/migrations/0001_initial.py | 40 ++++++------ apps/application/models/application.py | 4 +- apps/common/mixins/app_model_mixin.py | 4 +- apps/knowledge/migrations/0001_initial.py | 64 +++++++++---------- apps/knowledge/models/knowledge.py | 34 +++++----- .../migrations/0001_initial.py | 14 ++-- .../models/model_management.py | 10 +-- apps/system_manage/migrations/0001_initial.py | 26 ++++---- apps/system_manage/models/log_management.py | 4 +- .../models/workspace_user_permission.py | 12 ++-- apps/tools/migrations/0001_initial.py | 20 +++--- apps/tools/models/tool.py | 12 ++-- apps/users/migrations/0001_initial.py | 18 +++--- apps/users/models/user.py | 16 ++--- 14 files changed, 139 insertions(+), 139 deletions(-) diff --git a/apps/application/migrations/0001_initial.py b/apps/application/migrations/0001_initial.py index d1a61e29a..bd43cb420 100644 --- a/apps/application/migrations/0001_initial.py +++ b/apps/application/migrations/0001_initial.py @@ -30,12 +30,12 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Application', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), ('is_publish', models.BooleanField(default=False, verbose_name='是否发布')), - ('name', models.CharField(max_length=128, verbose_name='应用名称')), + ('name', models.CharField(db_index=True, max_length=128, verbose_name='应用名称')), ('desc', models.CharField(default='', max_length=512, verbose_name='引用描述')), ('prologue', models.CharField(default='', max_length=40960, verbose_name='开场白')), ('dialogue_number', models.IntegerField(default=0, verbose_name='会话数量')), @@ -69,8 +69,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ApplicationAccessToken', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('application', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='application.application', verbose_name='应用id')), ('access_token', models.CharField(max_length=128, unique=True, verbose_name='用户公开访问 认证token')), ('is_active', models.BooleanField(default=True, verbose_name='是否开启公开访问')), @@ -88,8 +88,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ApplicationApiKey', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('secret_key', models.CharField(max_length=1024, unique=True, verbose_name='秘钥')), ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), @@ -106,10 +106,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ApplicationFolder', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.CharField(editable=False, max_length=64, primary_key=True, serialize=False, verbose_name='主键id')), - ('name', models.CharField(max_length=64, verbose_name='文件夹名称')), + ('name', models.CharField(db_index=True, max_length=64, verbose_name='文件夹名称')), ('desc', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')), ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), ('lft', models.PositiveIntegerField(editable=False)), @@ -131,8 +131,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ApplicationKnowledgeMapping', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('application', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='application.application')), ('knowledge', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge')), @@ -144,8 +144,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ApplicationVersion', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('name', models.CharField(default='', max_length=128, verbose_name='版本名称')), ('publish_user_id', models.UUIDField(default=None, null=True, verbose_name='发布者id')), @@ -185,8 +185,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Chat', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('abstract', models.CharField(max_length=1024, verbose_name='摘要')), ('chat_user_id', models.CharField(default=None, null=True, verbose_name='对话用户id')), @@ -207,8 +207,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ChatRecord', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('vote_status', models.CharField(choices=[('-1', '未投票'), ('0', '赞同'), ('1', '反对')], default='-1', max_length=10, verbose_name='投票')), ('problem_text', models.CharField(max_length=10240, verbose_name='问题')), @@ -230,8 +230,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ApplicationChatUserStats', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('chat_user_id', models.UUIDField(default=uuid_utils.compat.uuid7, verbose_name='对话用户id')), ('chat_user_type', models.CharField(choices=[('ANONYMOUS_USER', '匿名用户'), ('CHAT_USER', '对话用户'), ('SYSTEM_API_KEY', '系统API_KEY'), ('APPLICATION_API_KEY', '应用API_KEY'), ('PLATFORM_USER', '平台用户')], default='ANONYMOUS_USER', max_length=64, verbose_name='对话用户类型')), diff --git a/apps/application/models/application.py b/apps/application/models/application.py index e83594c69..a8a38b960 100644 --- a/apps/application/models/application.py +++ b/apps/application/models/application.py @@ -19,7 +19,7 @@ from users.models import User class ApplicationFolder(MPTTModel, AppModelMixin): id = models.CharField(primary_key=True, max_length=64, editable=False, verbose_name="主键id") - name = models.CharField(max_length=64, verbose_name="文件夹名称") + name = models.CharField(max_length=64, verbose_name="文件夹名称", db_index=True) desc = models.CharField(max_length=200, null=True, blank=True, verbose_name="描述") user = models.ForeignKey(User, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True) workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True) @@ -62,7 +62,7 @@ class Application(AppModelMixin): folder = models.ForeignKey(ApplicationFolder, on_delete=models.DO_NOTHING, verbose_name="文件夹id", default='default') is_publish = models.BooleanField(verbose_name="是否发布", default=False) - name = models.CharField(max_length=128, verbose_name="应用名称") + name = models.CharField(max_length=128, verbose_name="应用名称", db_index=True) desc = models.CharField(max_length=512, verbose_name="引用描述", default="") prologue = models.CharField(max_length=40960, verbose_name="开场白", default="") dialogue_number = models.IntegerField(default=0, verbose_name="会话数量") diff --git a/apps/common/mixins/app_model_mixin.py b/apps/common/mixins/app_model_mixin.py index 412dbae00..b17d233bd 100644 --- a/apps/common/mixins/app_model_mixin.py +++ b/apps/common/mixins/app_model_mixin.py @@ -10,8 +10,8 @@ from django.db import models class AppModelMixin(models.Model): - create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True) - update_time = models.DateTimeField(verbose_name="修改时间", auto_now=True) + create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True, db_index=True) + update_time = models.DateTimeField(verbose_name="修改时间", auto_now=True, db_index=True) class Meta: abstract = True diff --git a/apps/knowledge/migrations/0001_initial.py b/apps/knowledge/migrations/0001_initial.py index 7a92a0c8d..f083f0b93 100644 --- a/apps/knowledge/migrations/0001_initial.py +++ b/apps/knowledge/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.4 on 2025-07-13 06:33 +# Generated by Django 5.2.4 on 2025-07-14 03:50 import django.contrib.postgres.search import django.db.models.deletion @@ -28,14 +28,14 @@ class Migration(migrations.Migration): migrations.CreateModel( name='File', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('file_name', models.CharField(default='', max_length=256, verbose_name='文件名称')), ('file_size', models.IntegerField(default=0, verbose_name='文件大小')), ('sha256_hash', models.CharField(default='', verbose_name='文件sha256_hash标识')), - ('source_type', models.CharField(choices=[('KNOWLEDGE', 'Knowledge'), ('APPLICATION', 'Application'), ('TOOL', 'Tool'), ('DOCUMENT', 'Document'), ('CHAT', 'Chat'), ('TEMPORARY_30_MINUTE', 'Temporary 30 Minute'), ('TEMPORARY_120_MINUTE', 'Temporary 120 Minute'), ('TEMPORARY_1_DAY', 'Temporary 1 Day')], default='TEMPORARY_120_MINUTE', verbose_name='资源类型')), - ('source_id', models.CharField(default='TEMPORARY_120_MINUTE', verbose_name='资源id')), + ('source_type', models.CharField(choices=[('KNOWLEDGE', 'Knowledge'), ('APPLICATION', 'Application'), ('TOOL', 'Tool'), ('DOCUMENT', 'Document'), ('CHAT', 'Chat'), ('TEMPORARY_30_MINUTE', 'Temporary 30 Minute'), ('TEMPORARY_120_MINUTE', 'Temporary 120 Minute'), ('TEMPORARY_1_DAY', 'Temporary 1 Day')], db_index=True, default='TEMPORARY_120_MINUTE', verbose_name='资源类型')), + ('source_id', models.CharField(db_index=True, default='TEMPORARY_120_MINUTE', verbose_name='资源id')), ('loid', models.IntegerField(verbose_name='loid')), ('meta', models.JSONField(default=dict, verbose_name='文件关联数据')), ], @@ -46,14 +46,14 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Knowledge', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('name', models.CharField(max_length=150, verbose_name='知识库名称')), + ('name', models.CharField(db_index=True, max_length=150, verbose_name='知识库名称')), ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), ('desc', models.CharField(max_length=256, verbose_name='描述')), - ('type', models.IntegerField(choices=[(0, '通用类型'), (1, 'web站点类型'), (2, '飞书类型'), (3, '语雀类型')], default=0, verbose_name='类型')), - ('scope', models.CharField(choices=[('SHARED', '共享'), ('WORKSPACE', '工作空间可用')], default='WORKSPACE', max_length=20, verbose_name='可用范围')), + ('type', models.IntegerField(choices=[(0, '通用类型'), (1, 'web站点类型'), (2, '飞书类型'), (3, '语雀类型')], db_index=True, default=0, verbose_name='类型')), + ('scope', models.CharField(choices=[('SHARED', '共享'), ('WORKSPACE', '工作空间可用')], db_index=True, default='WORKSPACE', max_length=20, verbose_name='可用范围')), ('file_size_limit', models.IntegerField(default=100, verbose_name='文件大小限制')), ('file_count_limit', models.IntegerField(default=50, verbose_name='文件数量限制')), ('meta', models.JSONField(default=dict, verbose_name='元数据')), @@ -67,15 +67,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Document', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('name', models.CharField(max_length=150, verbose_name='文档名称')), + ('name', models.CharField(db_index=True, max_length=150, verbose_name='文档名称')), ('char_length', models.IntegerField(verbose_name='文档字符数 冗余字段')), - ('status', models.CharField(default=knowledge.models.knowledge.get_default_status, max_length=20, verbose_name='状态')), + ('status', models.CharField(db_index=True, default=knowledge.models.knowledge.get_default_status, max_length=20, verbose_name='状态')), ('status_meta', models.JSONField(default=knowledge.models.knowledge.default_status_meta, verbose_name='状态统计数据')), - ('is_active', models.BooleanField(default=True)), - ('type', models.IntegerField(choices=[(0, '通用类型'), (1, 'web站点类型'), (2, '飞书类型'), (3, '语雀类型')], default=0, verbose_name='类型')), + ('is_active', models.BooleanField(db_index=True, default=True)), + ('type', models.IntegerField(choices=[(0, '通用类型'), (1, 'web站点类型'), (2, '飞书类型'), (3, '语雀类型')], db_index=True, default=0, verbose_name='类型')), ('hit_handling_method', models.CharField(choices=[('optimization', '模型优化'), ('directly_return', '直接返回')], default='optimization', max_length=20, verbose_name='命中处理方式')), ('directly_return_similarity', models.FloatField(default=0.9, verbose_name='直接回答相似度')), ('meta', models.JSONField(default=dict, verbose_name='元数据')), @@ -88,10 +88,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name='KnowledgeFolder', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.CharField(editable=False, max_length=64, primary_key=True, serialize=False, verbose_name='主键id')), - ('name', models.CharField(max_length=64, verbose_name='文件夹名称')), + ('name', models.CharField(db_index=True, max_length=64, verbose_name='文件夹名称')), ('desc', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')), ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), ('lft', models.PositiveIntegerField(editable=False)), @@ -113,15 +113,15 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Paragraph', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('content', models.CharField(max_length=102400, verbose_name='段落内容')), - ('title', models.CharField(default='', max_length=256, verbose_name='标题')), - ('status', models.CharField(default=knowledge.models.knowledge.get_default_status, max_length=20, verbose_name='状态')), + ('content', models.CharField(db_index=True, max_length=102400, verbose_name='段落内容')), + ('title', models.CharField(db_index=True, default='', max_length=256, verbose_name='标题')), + ('status', models.CharField(db_index=True, default=knowledge.models.knowledge.get_default_status, max_length=20, verbose_name='状态')), ('status_meta', models.JSONField(default=knowledge.models.knowledge.default_status_meta, verbose_name='状态数据')), ('hit_num', models.IntegerField(default=0, verbose_name='命中次数')), - ('is_active', models.BooleanField(default=True)), + ('is_active', models.BooleanField(db_index=True, default=True)), ('position', models.IntegerField(db_index=True, default=0, verbose_name='段落顺序')), ('document', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.document')), ('knowledge', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge')), @@ -134,8 +134,8 @@ class Migration(migrations.Migration): name='Embedding', fields=[ ('id', models.CharField(max_length=128, primary_key=True, serialize=False, verbose_name='主键id')), - ('source_id', models.CharField(max_length=128, verbose_name='资源id')), - ('source_type', models.CharField(choices=[(0, '问题'), (1, '段落'), (2, '标题')], default=0, max_length=5, verbose_name='资源类型')), + ('source_id', models.CharField(db_index=True, max_length=128, verbose_name='资源id')), + ('source_type', models.CharField(choices=[(0, '问题'), (1, '段落'), (2, '标题')], db_index=True, default=0, max_length=5, verbose_name='资源类型')), ('is_active', models.BooleanField(default=True, max_length=1, verbose_name='是否可用')), ('embedding', knowledge.models.knowledge.VectorField(verbose_name='向量')), ('search_vector', django.contrib.postgres.search.SearchVectorField(default='', verbose_name='分词')), @@ -151,10 +151,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Problem', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('content', models.CharField(max_length=256, verbose_name='问题内容')), + ('content', models.CharField(db_index=True, max_length=256, verbose_name='问题内容')), ('hit_num', models.IntegerField(default=0, verbose_name='命中次数')), ('knowledge', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge')), ], @@ -165,8 +165,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ProblemParagraphMapping', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('document', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.document')), ('knowledge', models.ForeignKey(db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, to='knowledge.knowledge')), diff --git a/apps/knowledge/models/knowledge.py b/apps/knowledge/models/knowledge.py index 796e81074..f6f709ce3 100644 --- a/apps/knowledge/models/knowledge.py +++ b/apps/knowledge/models/knowledge.py @@ -97,7 +97,7 @@ def default_status_meta(): class KnowledgeFolder(MPTTModel, AppModelMixin): id = models.CharField(primary_key=True, max_length=64, editable=False, verbose_name="主键id") - name = models.CharField(max_length=64, verbose_name="文件夹名称") + name = models.CharField(max_length=64, verbose_name="文件夹名称", db_index=True) desc = models.CharField(max_length=200, null=True, blank=True, verbose_name="描述") user = models.ForeignKey(User, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True) workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True) @@ -115,13 +115,13 @@ class Knowledge(AppModelMixin): 知识库表 """ id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") - name = models.CharField(max_length=150, verbose_name="知识库名称") + name = models.CharField(max_length=150, verbose_name="知识库名称", db_index=True) workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True) desc = models.CharField(max_length=256, verbose_name="描述") user = models.ForeignKey(User, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True) - type = models.IntegerField(verbose_name='类型', choices=KnowledgeType.choices, default=KnowledgeType.BASE) + type = models.IntegerField(verbose_name='类型', choices=KnowledgeType.choices, default=KnowledgeType.BASE, db_index=True) scope = models.CharField(max_length=20, verbose_name='可用范围', choices=KnowledgeScope.choices, - default=KnowledgeScope.WORKSPACE) + default=KnowledgeScope.WORKSPACE, db_index=True) folder = models.ForeignKey(KnowledgeFolder, on_delete=models.DO_NOTHING, verbose_name="文件夹id", default='default') embedding_model = models.ForeignKey(Model, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True) file_size_limit = models.IntegerField(verbose_name="文件大小限制", default=100) @@ -142,12 +142,12 @@ class Document(AppModelMixin): """ id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") knowledge = models.ForeignKey(Knowledge, on_delete=models.DO_NOTHING, verbose_name="知识库id") - name = models.CharField(max_length=150, verbose_name="文档名称") + name = models.CharField(max_length=150, verbose_name="文档名称", db_index=True) char_length = models.IntegerField(verbose_name="文档字符数 冗余字段") - status = models.CharField(verbose_name='状态', max_length=20, default=get_default_status) + status = models.CharField(verbose_name='状态', max_length=20, default=get_default_status, db_index=True) status_meta = models.JSONField(verbose_name="状态统计数据", default=default_status_meta) - is_active = models.BooleanField(default=True) - type = models.IntegerField(verbose_name='类型', choices=KnowledgeType.choices, default=KnowledgeType.BASE) + is_active = models.BooleanField(default=True, db_index=True) + type = models.IntegerField(verbose_name='类型', choices=KnowledgeType.choices, default=KnowledgeType.BASE, db_index=True) hit_handling_method = models.CharField(verbose_name='命中处理方式', max_length=20, choices=HitHandlingMethod.choices, default=HitHandlingMethod.optimization) @@ -166,12 +166,12 @@ class Paragraph(AppModelMixin): id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") document = models.ForeignKey(Document, on_delete=models.DO_NOTHING, db_constraint=False) knowledge = models.ForeignKey(Knowledge, on_delete=models.DO_NOTHING) - content = models.CharField(max_length=102400, verbose_name="段落内容") - title = models.CharField(max_length=256, verbose_name="标题", default="") - status = models.CharField(verbose_name='状态', max_length=20, default=get_default_status) + content = models.CharField(max_length=102400, verbose_name="段落内容", db_index=True) + title = models.CharField(max_length=256, verbose_name="标题", default="", db_index=True) + status = models.CharField(verbose_name='状态', max_length=20, default=get_default_status, db_index=True) status_meta = models.JSONField(verbose_name="状态数据", default=default_status_meta) hit_num = models.IntegerField(verbose_name="命中次数", default=0) - is_active = models.BooleanField(default=True) + is_active = models.BooleanField(default=True, db_index=True) position = models.IntegerField(verbose_name="段落顺序", default=0, db_index=True) class Meta: @@ -184,7 +184,7 @@ class Problem(AppModelMixin): """ id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") knowledge = models.ForeignKey(Knowledge, on_delete=models.DO_NOTHING, db_constraint=False) - content = models.CharField(max_length=256, verbose_name="问题内容") + content = models.CharField(max_length=256, verbose_name="问题内容", db_index=True) hit_num = models.IntegerField(verbose_name="命中次数", default=0) class Meta: @@ -241,9 +241,9 @@ class VectorField(models.Field): class Embedding(models.Model): id = models.CharField(max_length=128, primary_key=True, verbose_name="主键id") - source_id = models.CharField(max_length=128, verbose_name="资源id") + source_id = models.CharField(max_length=128, verbose_name="资源id", db_index=True) source_type = models.CharField(verbose_name='资源类型', max_length=5, choices=SourceType.choices, - default=SourceType.PROBLEM) + default=SourceType.PROBLEM, db_index=True) is_active = models.BooleanField(verbose_name="是否可用", max_length=1, default=True) knowledge = models.ForeignKey(Knowledge, on_delete=models.DO_NOTHING, verbose_name="文档关联", db_constraint=False) document = models.ForeignKey(Document, on_delete=models.DO_NOTHING, verbose_name="文档关联", db_constraint=False) @@ -262,8 +262,8 @@ class File(AppModelMixin): file_size = models.IntegerField(verbose_name="文件大小", default=0) sha256_hash = models.CharField(verbose_name="文件sha256_hash标识", default="") source_type = models.CharField(verbose_name="资源类型", choices=FileSourceType, - default=FileSourceType.TEMPORARY_120_MINUTE.value) - source_id = models.CharField(verbose_name="资源id", default=FileSourceType.TEMPORARY_120_MINUTE.value) + default=FileSourceType.TEMPORARY_120_MINUTE.value, db_index=True) + source_id = models.CharField(verbose_name="资源id", default=FileSourceType.TEMPORARY_120_MINUTE.value, db_index=True) loid = models.IntegerField(verbose_name="loid") meta = models.JSONField(verbose_name="文件关联数据", default=dict) diff --git a/apps/models_provider/migrations/0001_initial.py b/apps/models_provider/migrations/0001_initial.py index f53ae095b..543481483 100644 --- a/apps/models_provider/migrations/0001_initial.py +++ b/apps/models_provider/migrations/0001_initial.py @@ -39,14 +39,14 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Model', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('name', models.CharField(max_length=128, verbose_name='名称')), - ('status', models.CharField(choices=[('SUCCESS', '成功'), ('ERROR', '失败'), ('DOWNLOAD', '下载中'), ('PAUSE_DOWNLOAD', '暂停下载')], default='SUCCESS', max_length=20, verbose_name='设置类型')), - ('model_type', models.CharField(max_length=128, verbose_name='模型类型')), - ('model_name', models.CharField(max_length=128, verbose_name='模型名称')), - ('provider', models.CharField(max_length=128, verbose_name='供应商')), + ('name', models.CharField(db_index=True, max_length=128, verbose_name='名称')), + ('status', models.CharField(choices=[('SUCCESS', '成功'), ('ERROR', '失败'), ('DOWNLOAD', '下载中'), ('PAUSE_DOWNLOAD', '暂停下载')], db_index=True, default='SUCCESS', max_length=20, verbose_name='设置类型')), + ('model_type', models.CharField(db_index=True, max_length=128, verbose_name='模型类型')), + ('model_name', models.CharField(db_index=True, max_length=128, verbose_name='模型名称')), + ('provider', models.CharField(db_index=True, max_length=128, verbose_name='供应商')), ('credential', models.CharField(max_length=102400, verbose_name='模型认证信息')), ('meta', models.JSONField(default=dict, verbose_name='模型元数据,用于存储下载,或者错误信息')), ('model_params_form', models.JSONField(default=list, verbose_name='模型参数配置')), diff --git a/apps/models_provider/models/model_management.py b/apps/models_provider/models/model_management.py index c1c36a426..43d1bd9aa 100644 --- a/apps/models_provider/models/model_management.py +++ b/apps/models_provider/models/model_management.py @@ -24,18 +24,18 @@ class Model(AppModelMixin): """ id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") - name = models.CharField(max_length=128, verbose_name="名称") + name = models.CharField(max_length=128, verbose_name="名称", db_index=True) status = models.CharField(max_length=20, verbose_name='设置类型', choices=Status.choices, - default=Status.SUCCESS) + default=Status.SUCCESS, db_index=True) - model_type = models.CharField(max_length=128, verbose_name="模型类型") + model_type = models.CharField(max_length=128, verbose_name="模型类型", db_index=True) - model_name = models.CharField(max_length=128, verbose_name="模型名称") + model_name = models.CharField(max_length=128, verbose_name="模型名称", db_index=True) user = models.ForeignKey(User, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True) - provider = models.CharField(max_length=128, verbose_name='供应商') + provider = models.CharField(max_length=128, verbose_name='供应商', db_index=True) credential = models.CharField(max_length=102400, verbose_name="模型认证信息") diff --git a/apps/system_manage/migrations/0001_initial.py b/apps/system_manage/migrations/0001_initial.py index 5078e3ff4..c8d7910a5 100644 --- a/apps/system_manage/migrations/0001_initial.py +++ b/apps/system_manage/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.4 on 2025-07-13 06:33 +# Generated by Django 5.2.4 on 2025-07-14 03:50 import common.encoder.encoder import django.contrib.postgres.fields @@ -19,14 +19,14 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Log', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), ('menu', models.CharField(max_length=128, verbose_name='操作菜单')), - ('operate', models.CharField(max_length=128, verbose_name='操作')), + ('operate', models.CharField(db_index=True, max_length=128, verbose_name='操作')), ('operation_object', models.JSONField(default=dict, encoder=common.encoder.encoder.SystemEncoder, verbose_name='操作对象')), ('user', models.JSONField(default=dict, verbose_name='用户信息')), - ('status', models.IntegerField(verbose_name='状态')), + ('status', models.IntegerField(db_index=True, verbose_name='状态')), ('ip_address', models.CharField(max_length=128, verbose_name='ip地址')), ('details', models.JSONField(default=dict, encoder=common.encoder.encoder.SystemEncoder, verbose_name='详情')), ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), @@ -38,8 +38,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='SystemSetting', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('type', models.IntegerField(choices=[(0, '邮箱'), (1, '私钥秘钥')], default=0, primary_key=True, serialize=False, verbose_name='设置类型')), ('meta', models.JSONField(default=dict, verbose_name='配置数据')), ], @@ -51,13 +51,13 @@ class Migration(migrations.Migration): name='WorkspaceUserResourcePermission', fields=[ ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('workspace_id', models.CharField(default='default', max_length=128, verbose_name='工作空间id')), - ('auth_target_type', models.CharField(choices=[('KNOWLEDGE', '知识库'), ('APPLICATION', '应用'), ('TOOL', '工具'), ('MODEL', '模型')], default='KNOWLEDGE', max_length=128, verbose_name='授权目标')), - ('target', models.UUIDField(verbose_name='知识库/应用id')), - ('auth_type', models.CharField(choices=[('ROLE', 'Role'), ('RESOURCE_PERMISSION_GROUP', 'Resource Permission Group')], db_default='ROLE', default=False, verbose_name='授权类型')), + ('workspace_id', models.CharField(db_index=True, default='default', max_length=128, verbose_name='工作空间id')), + ('auth_target_type', models.CharField(choices=[('KNOWLEDGE', '知识库'), ('APPLICATION', '应用'), ('TOOL', '工具'), ('MODEL', '模型')], db_index=True, default='KNOWLEDGE', max_length=128, verbose_name='授权目标')), + ('target', models.UUIDField(db_index=True, verbose_name='知识库/应用id')), + ('auth_type', models.CharField(choices=[('ROLE', 'Role'), ('RESOURCE_PERMISSION_GROUP', 'Resource Permission Group')], db_default='ROLE', db_index=True, default=False, verbose_name='授权类型')), ('permission_list', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(blank=True, choices=[('VIEW', 'View'), ('MANAGE', 'Manage'), ('ROLE', 'Role')], default='VIEW', max_length=256), default=list, size=None, verbose_name='权限列表')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.user', verbose_name='工作空间下的用户')), ], options={ diff --git a/apps/system_manage/models/log_management.py b/apps/system_manage/models/log_management.py index c443c0588..0e20f2c55 100644 --- a/apps/system_manage/models/log_management.py +++ b/apps/system_manage/models/log_management.py @@ -22,13 +22,13 @@ class Log(AppModelMixin): menu = models.CharField(max_length=128, verbose_name="操作菜单") - operate = models.CharField(max_length=128, verbose_name="操作") + operate = models.CharField(max_length=128, verbose_name="操作", db_index=True) operation_object = models.JSONField(verbose_name="操作对象", default=dict, encoder=SystemEncoder) user = models.JSONField(verbose_name="用户信息", default=dict) - status = models.IntegerField(verbose_name="状态") + status = models.IntegerField(verbose_name="状态", db_index=True) ip_address = models.CharField(max_length=128, verbose_name="ip地址") diff --git a/apps/system_manage/models/workspace_user_permission.py b/apps/system_manage/models/workspace_user_permission.py index a83c3c656..13754b61e 100644 --- a/apps/system_manage/models/workspace_user_permission.py +++ b/apps/system_manage/models/workspace_user_permission.py @@ -31,18 +31,18 @@ class WorkspaceUserResourcePermission(models.Model): """ id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") - workspace_id = models.CharField(max_length=128, verbose_name="工作空间id", default="default") + workspace_id = models.CharField(max_length=128, verbose_name="工作空间id", default="default", db_index=True) user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="工作空间下的用户") auth_target_type = models.CharField(verbose_name='授权目标', max_length=128, choices=AuthTargetType.choices, - default=AuthTargetType.KNOWLEDGE) + default=AuthTargetType.KNOWLEDGE, db_index=True) # 授权的知识库或者应用的id - target = models.UUIDField(max_length=128, verbose_name="知识库/应用id") + target = models.UUIDField(max_length=128, verbose_name="知识库/应用id", db_index=True) # 授权类型 如果是Role那么就是角色的权限 如果是PERMISSION auth_type = models.CharField(default=False, verbose_name="授权类型", choices=ResourceAuthType.choices, - db_default=ResourceAuthType.ROLE) + db_default=ResourceAuthType.ROLE, db_index=True) # 资源权限列表 permission_list = ArrayField(verbose_name="权限列表", default=list, @@ -51,9 +51,9 @@ class WorkspaceUserResourcePermission(models.Model): choices=ResourcePermission.choices + ResourcePermissionRole.choices, default=ResourcePermission.VIEW)) - create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True) + create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True, db_index=True) - update_time = models.DateTimeField(verbose_name="修改时间", auto_now=True) + update_time = models.DateTimeField(verbose_name="修改时间", auto_now=True, db_index=True) class Meta: db_table = "workspace_user_resource_permission" diff --git a/apps/tools/migrations/0001_initial.py b/apps/tools/migrations/0001_initial.py index 883847d74..6f48439ab 100644 --- a/apps/tools/migrations/0001_initial.py +++ b/apps/tools/migrations/0001_initial.py @@ -28,10 +28,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name='ToolFolder', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.CharField(editable=False, max_length=64, primary_key=True, serialize=False, verbose_name='主键id')), - ('name', models.CharField(max_length=64, verbose_name='文件夹名称')), + ('name', models.CharField(db_index=True, max_length=64, verbose_name='文件夹名称')), ('desc', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')), ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), ('lft', models.PositiveIntegerField(editable=False)), @@ -49,22 +49,22 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Tool', fields=[ - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, verbose_name='修改时间')), ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('name', models.CharField(max_length=64, verbose_name='工具名称')), + ('name', models.CharField(db_index=True, max_length=64, verbose_name='工具名称')), ('desc', models.CharField(max_length=128, verbose_name='描述')), ('code', models.CharField(max_length=102400, verbose_name='python代码')), ('input_field_list', models.JSONField(default=list, verbose_name='输入字段列表')), ('init_field_list', models.JSONField(default=list, verbose_name='启动字段列表')), ('icon', models.CharField(default='', max_length=256, verbose_name='工具库icon')), - ('is_active', models.BooleanField(default=True)), - ('scope', models.CharField(choices=[('SHARED', '共享'), ('WORKSPACE', '工作空间可用'), ('INTERNAL', '内置')], default='WORKSPACE', max_length=20, verbose_name='可用范围')), + ('is_active', models.BooleanField(db_index=True, default=True)), + ('scope', models.CharField(choices=[('SHARED', '共享'), ('WORKSPACE', '工作空间可用'), ('INTERNAL', '内置')], db_index=True, default='WORKSPACE', max_length=20, verbose_name='可用范围')), ('tool_type', models.CharField(choices=[('INTERNAL', '内置'), ('CUSTOM', '自定义')], db_index=True, default='CUSTOM', max_length=20, verbose_name='工具类型')), - ('template_id', models.UUIDField(default=None, null=True, verbose_name='模版id')), + ('template_id', models.UUIDField(db_index=True, default=None, null=True, verbose_name='模版id')), ('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')), ('init_params', models.CharField(max_length=102400, null=True, verbose_name='初始化参数')), - ('label', models.CharField(max_length=128, null=True, verbose_name='标签')), + ('label', models.CharField(db_index=True, max_length=128, null=True, verbose_name='标签')), ('user', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to='users.user')), ('folder', models.ForeignKey(default='default', on_delete=django.db.models.deletion.DO_NOTHING, to='tools.toolfolder', verbose_name='文件夹id')), ], diff --git a/apps/tools/models/tool.py b/apps/tools/models/tool.py index c1b736035..73e9ee1f5 100644 --- a/apps/tools/models/tool.py +++ b/apps/tools/models/tool.py @@ -9,7 +9,7 @@ from users.models import User class ToolFolder(MPTTModel, AppModelMixin): id = models.CharField(primary_key=True, max_length=64, editable=False, verbose_name="主键id") - name = models.CharField(max_length=64, verbose_name="文件夹名称") + name = models.CharField(max_length=64, verbose_name="文件夹名称", db_index=True) desc = models.CharField(max_length=200, null=True, blank=True, verbose_name="描述") user = models.ForeignKey(User, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True) workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True) @@ -36,22 +36,22 @@ class ToolType(models.TextChoices): class Tool(AppModelMixin): id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") user = models.ForeignKey(User, on_delete=models.SET_NULL, db_constraint=False, blank=True, null=True) - name = models.CharField(max_length=64, verbose_name="工具名称") + name = models.CharField(max_length=64, verbose_name="工具名称", db_index=True) desc = models.CharField(max_length=128, verbose_name="描述") code = models.CharField(max_length=102400, verbose_name="python代码") input_field_list = models.JSONField(verbose_name="输入字段列表", default=list) init_field_list = models.JSONField(verbose_name="启动字段列表", default=list) icon = models.CharField(max_length=256, verbose_name="工具库icon", default="") - is_active = models.BooleanField(default=True) + is_active = models.BooleanField(default=True, db_index=True) scope = models.CharField(max_length=20, verbose_name='可用范围', choices=ToolScope.choices, - default=ToolScope.WORKSPACE) + default=ToolScope.WORKSPACE, db_index=True) tool_type = models.CharField(max_length=20, verbose_name='工具类型', choices=ToolType.choices, default=ToolType.CUSTOM, db_index=True) - template_id = models.UUIDField(max_length=128, verbose_name="模版id", null=True, default=None) + template_id = models.UUIDField(max_length=128, verbose_name="模版id", null=True, default=None, db_index=True) folder = models.ForeignKey(ToolFolder, on_delete=models.DO_NOTHING, verbose_name="文件夹id", default='default') workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True) init_params = models.CharField(max_length=102400, verbose_name="初始化参数", null=True) - label = models.CharField(max_length=128, verbose_name="标签", null=True) + label = models.CharField(max_length=128, verbose_name="标签", null=True, db_index=True) class Meta: db_table = "tool" diff --git a/apps/users/migrations/0001_initial.py b/apps/users/migrations/0001_initial.py index 0d389d99f..6291d6e5f 100644 --- a/apps/users/migrations/0001_initial.py +++ b/apps/users/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.4 on 2025-07-13 06:33 +# Generated by Django 5.2.4 on 2025-07-14 03:50 import uuid_utils.compat from django.db import migrations, models @@ -31,17 +31,17 @@ class Migration(migrations.Migration): name='User', fields=[ ('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')), - ('email', models.EmailField(blank=True, max_length=254, null=True, unique=True, verbose_name='邮箱')), - ('phone', models.CharField(default='', max_length=20, verbose_name='电话')), - ('nick_name', models.CharField(max_length=150, unique=True, verbose_name='昵称')), - ('username', models.CharField(max_length=150, unique=True, verbose_name='用户名')), + ('email', models.EmailField(blank=True, db_index=True, max_length=254, null=True, unique=True, verbose_name='邮箱')), + ('phone', models.CharField(db_index=True, default='', max_length=20, verbose_name='电话')), + ('nick_name', models.CharField(db_index=True, max_length=150, unique=True, verbose_name='昵称')), + ('username', models.CharField(db_index=True, max_length=150, unique=True, verbose_name='用户名')), ('password', models.CharField(max_length=150, verbose_name='密码')), ('role', models.CharField(max_length=150, verbose_name='角色')), - ('source', models.CharField(default='LOCAL', max_length=10, verbose_name='来源')), - ('is_active', models.BooleanField(default=True)), + ('source', models.CharField(db_index=True, default='LOCAL', max_length=10, verbose_name='来源')), + ('is_active', models.BooleanField(db_index=True, default=True)), ('language', models.CharField(default=None, max_length=10, null=True, verbose_name='语言')), - ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')), + ('create_time', models.DateTimeField(auto_now_add=True, db_index=True, null=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, db_index=True, null=True, verbose_name='修改时间')), ], options={ 'db_table': 'user', diff --git a/apps/users/models/user.py b/apps/users/models/user.py index b6ba27413..0f480d89f 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -15,17 +15,17 @@ from common.utils.common import password_encrypt class User(models.Model): id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id") - email = models.EmailField(unique=True, null=True, blank=True, verbose_name="邮箱") - phone = models.CharField(max_length=20, verbose_name="电话", default="") - nick_name = models.CharField(max_length=150, verbose_name="昵称", unique=True) - username = models.CharField(max_length=150, unique=True, verbose_name="用户名") + email = models.EmailField(unique=True, null=True, blank=True, verbose_name="邮箱", db_index=True) + phone = models.CharField(max_length=20, verbose_name="电话", default="", db_index=True) + nick_name = models.CharField(max_length=150, verbose_name="昵称", unique=True, db_index=True) + username = models.CharField(max_length=150, unique=True, verbose_name="用户名", db_index=True) password = models.CharField(max_length=150, verbose_name="密码") role = models.CharField(max_length=150, verbose_name="角色") - source = models.CharField(max_length=10, verbose_name="来源", default="LOCAL") - is_active = models.BooleanField(default=True) + source = models.CharField(max_length=10, verbose_name="来源", default="LOCAL", db_index=True) + is_active = models.BooleanField(default=True, db_index=True) language = models.CharField(max_length=10, verbose_name="语言", null=True, default=None) - create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True, null=True) - update_time = models.DateTimeField(verbose_name="修改时间", auto_now=True, null=True) + create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True, null=True, db_index=True) + update_time = models.DateTimeField(verbose_name="修改时间", auto_now=True, null=True, db_index=True) USERNAME_FIELD = 'username' REQUIRED_FIELDS = []