前言
在上一篇文章中介绍,我们可以在python manage.py shell
或者后台管理界面里创建博客,但是如果要创建大量博客来测试博客应用的时候,这两个方法就太麻烦了,所以可以编写一个函数来生成测试数据,同时编写一个django-admin
命令来调用这个函数,就可以通过python manage.py <command-name>
来调用了。
编写生成数据的函数
首先先清除数据库中的Tag、Category和Post,然后再次创建,下面这个函数就是生成100篇Post。
def fake_data():
#删除所有数据
Tag.objects.all().delete()
Category.objects.all().delete()
Post.objects.all().delete()
#获取第一个用户,当前只有一个超级用户
user = User.objects.all().first()
#创建标签
tag = ('django', 'python', 'java', 'javascript', 'css', 'html', 'web', 'app')
tags = []
for t in tag:
tags.append(Tag.objects.create(name=t))
#随机挑选1到5个标签
def random_tags():
return random.sample(tags, random.randint(1, 5))
#创建类别
category = ('python教程', 'django教程', 'android教程', 'java教程')
categories = []
for c in category:
categories.append(Category.objects.create(name=c))
#随机挑选一个类别
def random_category():
return random.choice(categories)
#随机datetime
def random_datetime():
return datetime.datetime(random.randint(2015, 2017), # year
random.randint(1, 12), # month
random.randint(1, 28), # day
random.randint(0, 23), # hour
random.randint(0, 59), # min
random.randint(0, 59), # sec
random.randint(0, 100), # microsecond
timezone.utc if settings.USE_TZ else None)
#创建100篇博客
for i in range(0, 100):
post = Post.objects.create(title="title %s" % i, excerpt="summary %s" % i, body="content %s" % i, author=user, category=random_category(), created_time=random_datetime())
post.tags.add(*random_tags())
有了这个函数之后,直接在命令行里调用也行,但是太麻烦了。所以接下来编写一个django-admin
命令来调用它。
编写命令
怎么编写django-admin命令可以查看官方文档 Writing custom django-admin commands
在blog
目录下,创建management/commands
目录,在management/commands
目录里新建一个fake_data.py
,这个文件名就是命令名字。
此时blog
目录下类似
blog/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
fake_data.py
tests.py
views.py
编写django-admin
命令,最重要的是继承BaseCommand
类,在handle
方法里直接调用fake_data
函数就可以了
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'Import init data for test'
def handle(self, *args, **options):
self.stdout.write(self.style.SUCCESS('begin import'))
fake_data()
self.stdout.write(self.style.SUCCESS('end import'))
测试
执行python manage.py
,可以看到多了一个fake_data
的命令
...
[blog]
fake_data
执行python manage.py fake_data
,再去后台管理网站查看,会发现生成了100篇博客。接下来就可以用这些数据来测试我们的博客应用了。