# Generated by Django 5.2.12 on 2026-06-12 11:39 import django.db.models.deletion from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Chapter', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=200)), ('sort_order', models.IntegerField(default=0)), ('duration', models.CharField(blank=True, default='', max_length=50, verbose_name='时长')), ('is_free', models.BooleanField(default=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ], options={ 'verbose_name': '章节', 'verbose_name_plural': '章节', 'ordering': ['sort_order'], }, ), migrations.CreateModel( name='ChapterContent', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('content_md', models.TextField(blank=True, default='', verbose_name='Markdown内容')), ('content_html', models.TextField(blank=True, default='', verbose_name='预渲染HTML')), ('md_file_path', models.CharField(blank=True, default='', max_length=500, verbose_name='MD文件路径')), ('updated_at', models.DateTimeField(auto_now=True)), ('chapter', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='content', to='learn.chapter', verbose_name='章节')), ], options={ 'verbose_name': '章节内容', 'verbose_name_plural': '章节内容', }, ), migrations.CreateModel( name='Course', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=200, verbose_name='标题')), ('description', models.TextField(blank=True, default='', verbose_name='描述')), ('category', models.CharField(choices=[('frontend', '前端'), ('backend', '后端'), ('tools', '工具'), ('devops', '运维'), ('security', '安全'), ('basic', '基础')], default='frontend', max_length=20)), ('level', models.CharField(choices=[('beginner', '入门'), ('advanced', '进阶')], default='beginner', max_length=10)), ('cover_image', models.ImageField(blank=True, null=True, upload_to='learn/covers/%Y/%m/')), ('color', models.CharField(default='#667eea', max_length=20, verbose_name='主题色')), ('icon_name', models.CharField(default='CodeOutlined', max_length=50, verbose_name='图标名称')), ('status', models.CharField(choices=[('published', '已发布'), ('draft', '草稿')], default='draft', max_length=20)), ('sort_order', models.IntegerField(default=0)), ('is_hot', models.BooleanField(default=False)), ('is_new', models.BooleanField(default=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='courses', to=settings.AUTH_USER_MODEL, verbose_name='作者')), ], options={ 'verbose_name': '课程', 'verbose_name_plural': '课程', 'ordering': ['-sort_order', '-created_at'], }, ), migrations.AddField( model_name='chapter', name='course', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='chapters', to='learn.course', verbose_name='课程'), ), ]