feat: add db_index to various fields for improved query performance

This commit is contained in:
CaptainB 2025-07-14 11:54:19 +08:00
parent 07b19fe90e
commit ea56fd6212
14 changed files with 139 additions and 139 deletions

View File

@ -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='对话用户类型')),

View File

@ -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="会话数量")

View File

@ -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

View File

@ -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')),

View File

@ -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)

View File

@ -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='模型参数配置')),

View File

@ -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="模型认证信息")

View File

@ -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={

View File

@ -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地址")

View File

@ -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"

View File

@ -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')),
],

View File

@ -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"

View File

@ -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',

View File

@ -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 = []