目前使用的环境:django4.2.3,python3.10
django通过一些第三方库,可以轻易的自动生成一系列的后台数据。
首先先创建一个数据库:
然后,在setting.py中就可以指定我们新创建的数据库了。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'machine_database_test',
'USER': 'root',
'PASSWORD': '123456',
# The database server actually runs on the statusweb machine and
# requires local authentication. This will work for both PAO and W2,
# so this will save the settings_local.py need on W2.
'HOST': '127.0.0.1',
}
}
然后,需要执行数据迁移命令:
python manage.py makemigrations
python manage.py migrate
最好在虚拟环境中执行这些内容,会比较方便:
然后,顺便创建一个超级用户:
python manage.py createsuperuser
然后,看看需要下载的第三方包:
pip install model_bakery
然后创建一个脚本,一般情况,都会放到一个app文件夹下。
脚本的名称,也不重要,我这里叫 baker_recipes.py,文件内容如下:
import os
import django
from model_bakery import baker
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "machine_database.settings")
django.setup()
customers = baker.make('machines.Repository', _quantity=3)
这里有几个点需要注意:
第一,DJANGO_SETTINGS_MODULE 这个变量必须设置,否则运行的时候会报错,就像这样:
第二,django.setup() 一定要执行,否则设置不生效。
第三,baker.make()里面的第一个参数,其实就是给定的model表的名称,这里其实有两种写法
import os
import django
from model_bakery import baker
from machines.models import Repository
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "machine_database.settings")
django.setup()
customers = baker.make('Repository', _quantity=3)
官网上是这么介绍的.....
但是,我这么做了,然后就反复的报错....
所以,最好不要这么干,就按照我上面的第一种写法,可以不导入model,直接以 app_name.model_name的方式直接用就好。
第四,baker.make() 中的 _quantity 参数的意思是,创建几个随机数据。
然后,之所写这篇帖子是因为,感觉这玩意儿,真挺6的....
先看看我的models.py:
class Ethernet(models.Model):
interface = models.CharField(max_length=32)
class Meta:
verbose_name_plural = 'Ethernet Interfaces'
verbose_name = 'Ethernet Interface'
class Machine(models.Model):
hostname = models.CharField(max_length=255, unique=True)
ethernets = models.ManyToManyField(Ethernet, related_name='machine')
def __str__(self):
return "%s" % self.hostname
class Meta:
verbose_name_plural = 'machines'
ordering = ['id']
class Repository(models.Model):
description = models.TextField()
machine = models.ForeignKey(Machine, on_delete=models.CASCADE)
ethernet = models.ForeignKey(Ethernet, on_delete=models.CASCADE)
然后就能发现,Repository 这张表,跟两外两张表都有联系。所以,我只需要在 baker.make()中指定 Repository 这张表就可以了,由于它们之间的关联原因,baker会直接生成3张表的相关数据的。
执行上面的脚本就可以了,也很简单...
python baker_recipes.py
这里注意,执行一遍就好....否则你执行2遍就是创建 6 组数据....
看看结果:
可以吧,确实都造出来了....只是,随机数....比较长....稍微看起来,有点费劲....
当然,造随机数据的时候,也可以不全部随机,可以选择一些字段随机....
我就浅尝辄止....记录一下...更多的东西,官网有,感兴趣的小伙伴可以自己看看....