我一直在Django中进行开发,想知道是否有一种方法可以将数据播种到Django中的数据库中。
在ruby on rails中,我使用seed.rb,然后在命令行中运行“ rake db:seed”。
我想为项目初始化的状态,类型等种子一些数据的主要原因。
有类似的东西吗?
答案 0 :(得分:6)
类似于Rails,我们还可以选择播种数据库。使用management commands完成。在您的一个应用中,使用以下文件夹结构
<project>/<app>/management/commands/seed.py
这将python manage.py seed
用作管理命令。我个人遵循以下结构。
# <project>/<app>/management/commands/seed.py
from django.core.management.base import BaseCommand
import random
# python manage.py seed --mode=refresh
class Command(BaseCommand):
help = "seed database for testing and development."
def add_arguments(self, parser):
parser.add_argument('--mode', type=str, help="Mode")
def handle(self, *args, **options):
self.stdout.write('seeding data...')
run_seed(self, options['mode'])
self.stdout.write('done.')
def clear_data():
"""Deletes all the table data"""
logger.info("Delete Address instances")
Address.objects.all().delete()
def create_address():
"""Creates an address object combining different elements from the list"""
logger.info("Creating address")
street_flats = ["#221 B", "#101 A", "#550I", "#420G", "#A13"]
street_localities = ["Bakers Street", "Rajori Gardens", "Park Street", "MG Road", "Indiranagar"]
pincodes = ["101234", "101232", "101231", "101236", "101239"]
address = Address(
street_flat=random.choice(street_flats),
street_locality=random.choice(street_localities),
pincode=random.choice(pincodes),
)
address.save()
logger.info("{} address created.".format(address))
return address
def run_seed(self, mode):
""" Seed database based on mode
:param mode: refresh / clear
:return:
"""
# Clear data from tables
clear_data()
if mode == MODE_CLEAR:
return
# Creating 15 addresses
for i in range(15):
create_address()
在上面的结构中,可以添加自定义模式,并进行相应的种子设定。另外,您可以添加其他管理命令参数(例如number_of_addresses并将其传递给运行种子。命令为python manage.py seed --mode=refresh --number_of_addresses=15
)。
希望这会有所帮助。干杯!
答案 1 :(得分:2)
有多种向Django提供种子数据的方法:
如果您是原型设计者,但又不关心在各个环境之间保持一致性,那么使用Django的dumpdata和loaddata非常简单,快捷:
$ ./manage.py dumpdata myApp.MyModel [myApp.AnotherModel] --output <myfile>
$ ./manage.py loaddata <path-to-myfile>
产生的fixture files可以具有不同的格式(默认情况下为json),因此易于编辑或生成,并且包含有关所引用的应用程序/模型的信息,因此易于加载。
如果您需要在各个环境之间保持一致性,请执行以下任一操作:
./manage.py makemigrations --empty <myapp> --name seed_<my_model>
或为每个@anurag的答案添加custom management command
答案 2 :(得分:1)
根据django 2.2 docs,您可以通过创建固定装置来播种数据库。 如果您已经有一些数据,那么创建灯具的最直接的方法是使用manage.py dumpdata命令。或者,您可以手动编写固定装置。灯具可以写为JSON,XML或YAML。
不过,作为示例,这是用于简单Person模型的固定装置在JSON中的外观:
[
{
"model": "myapp.person",
"pk": 1,
"fields": {
"first_name": "John",
"last_name": "Snow"
}
},
{
"model": "myapp.person",
"pk": 2,
"fields": {
"first_name": "Paul",
"last_name": "McCartney"
}
}
]
这与YAML相同:
- model: myapp.person
pk: 1
fields:
first_name: John
last_name: Snow
- model: myapp.person
pk: 2
fields:
first_name: Paul
last_name: McCartney
您会将这些数据存储在应用程序内的Fixtures目录中。
加载数据非常容易:只需call manage.py loaddata <fixturename>
,其中<fixturename>
是您创建的夹具文件的名称。
答案 3 :(得分:0)
您可以创建数据迁移。...https://docs.djangoproject.com/en/2.0/topics/migrations/#data-migrations
python manage.py makemigrations --empty appname
答案 4 :(得分:0)
我正在使用此库
https://pypi.org/project/django-seed/
document.getElementById('btn').addEventListener("click",function (event) {
event.preventDefault();
var countryName = document.getElementById("name").value;
var countryArea = document.getElementById("area").value;
var countryPopulation = document.getElementById("population").value;
var countryCallingCode = document.getElementById("calling_code").value;
if (countryName !== "" && countryArea !== "" && countryPopulation !== "" && countryCallingCode !== "") {
var postReq = new XMLHttpRequest();
postReq.open('POST', '', true);
var data = {
area: countryArea,
calling_code: countryCallingCode,
created_at: Date.now(),
id: ID,
name: countryName,
population: countryPopulation
};
console.log(data.id);
var jsonPost = JSON.stringify(data);
postReq.onload = function () {
var countries = JSON.parse(postReq.responseText);
if (postReq.readyState == 4 && postReq.status == "201") {
console.log(countries);
}
}
postReq.send(jsonPost);
}
});