|
|
|
|
@ -1,40 +1,76 @@
|
|
|
|
|
# 导入Django用户模型、密码加密、命令基类
|
|
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
|
from django.contrib.auth.hashers import make_password
|
|
|
|
|
from django.core.management.base import BaseCommand
|
|
|
|
|
|
|
|
|
|
# 导入博客应用的核心模型
|
|
|
|
|
from blog.models import Article, Tag, Category
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Command(BaseCommand):
|
|
|
|
|
"""
|
|
|
|
|
Django自定义管理命令:创建测试数据
|
|
|
|
|
用于快速生成用户、分类、标签和文章等测试数据,方便开发和测试
|
|
|
|
|
"""
|
|
|
|
|
# 命令的帮助信息(执行python manage.py help create_testdata时显示)
|
|
|
|
|
help = 'create test datas'
|
|
|
|
|
|
|
|
|
|
def handle(self, *args, **options):
|
|
|
|
|
"""
|
|
|
|
|
命令核心执行逻辑
|
|
|
|
|
当运行python manage.py create_testdata时调用,生成测试数据
|
|
|
|
|
"""
|
|
|
|
|
# 1. 创建或获取测试用户
|
|
|
|
|
# get_or_create:存在则获取,不存在则创建(避免重复生成)
|
|
|
|
|
# make_password:加密密码(安全存储)
|
|
|
|
|
user = get_user_model().objects.get_or_create(
|
|
|
|
|
email='test@test.com', username='测试用户', password=make_password('test!q@w#eTYU'))[0]
|
|
|
|
|
email='test@test.com', # 测试邮箱
|
|
|
|
|
username='测试用户', # 用户名
|
|
|
|
|
password=make_password('test!q@w#eTYU') # 加密后的密码
|
|
|
|
|
)[0] # [0]取返回元组中的用户对象
|
|
|
|
|
|
|
|
|
|
# 2. 创建分类(含层级关系)
|
|
|
|
|
# 创建父分类(无上级分类)
|
|
|
|
|
pcategory = Category.objects.get_or_create(
|
|
|
|
|
name='我是父类目', parent_category=None)[0]
|
|
|
|
|
name='我是父类目',
|
|
|
|
|
parent_category=None # 顶级分类
|
|
|
|
|
)[0]
|
|
|
|
|
|
|
|
|
|
# 创建子分类(关联父分类)
|
|
|
|
|
category = Category.objects.get_or_create(
|
|
|
|
|
name='子类目', parent_category=pcategory)[0]
|
|
|
|
|
name='子类目',
|
|
|
|
|
parent_category=pcategory # 关联到父分类
|
|
|
|
|
)[0]
|
|
|
|
|
category.save() # 保存子分类
|
|
|
|
|
|
|
|
|
|
category.save()
|
|
|
|
|
# 3. 创建基础标签(供所有测试文章共用)
|
|
|
|
|
basetag = Tag()
|
|
|
|
|
basetag.name = "标签"
|
|
|
|
|
basetag.name = "标签" # 标签名称
|
|
|
|
|
basetag.save()
|
|
|
|
|
|
|
|
|
|
# 4. 批量创建测试文章(1-19共19篇)
|
|
|
|
|
for i in range(1, 20):
|
|
|
|
|
# 创建或获取文章
|
|
|
|
|
article = Article.objects.get_or_create(
|
|
|
|
|
category=category,
|
|
|
|
|
title='nice title ' + str(i),
|
|
|
|
|
body='nice content ' + str(i),
|
|
|
|
|
author=user)[0]
|
|
|
|
|
category=category, # 关联到子分类
|
|
|
|
|
title=f'nice title {i}', # 文章标题(带序号)
|
|
|
|
|
body=f'nice content {i}', # 文章内容(带序号)
|
|
|
|
|
author=user # 关联到测试用户
|
|
|
|
|
)[0]
|
|
|
|
|
|
|
|
|
|
# 为每篇文章创建专属标签
|
|
|
|
|
tag = Tag()
|
|
|
|
|
tag.name = "标签" + str(i)
|
|
|
|
|
tag.name = f"标签{i}" # 标签名称(带序号)
|
|
|
|
|
tag.save()
|
|
|
|
|
|
|
|
|
|
# 给文章添加标签(专属标签 + 基础标签)
|
|
|
|
|
article.tags.add(tag)
|
|
|
|
|
article.tags.add(basetag)
|
|
|
|
|
article.save()
|
|
|
|
|
article.save() # 保存文章(更新标签关联)
|
|
|
|
|
|
|
|
|
|
# 5. 清除缓存(确保新生成的测试数据能立即生效)
|
|
|
|
|
from djangoblog.utils import cache
|
|
|
|
|
cache.clear()
|
|
|
|
|
self.stdout.write(self.style.SUCCESS('created test datas \n'))
|
|
|
|
|
|
|
|
|
|
# 输出成功信息到控制台
|
|
|
|
|
self.stdout.write(self.style.SUCCESS('created test datas \n'))
|