如何播种Django项目? -将一堆数据插入项目以进行初始化

时间:2018-07-29 05:16:04

标签: python django django-queryset seed

我一直在Django中进行开发,想知道是否有一种方法可以将数据播种到Django中的数据库中。

在ruby on rails中,我使用seed.rb,然后在命令行中运行“ rake db:seed”。

我想为项目初始化的状态,类型等种子一些数据的主要原因。

有类似的东西吗?

5 个答案:

答案 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的dumpdataloaddata非常简单,快捷:

$ ./manage.py dumpdata myApp.MyModel [myApp.AnotherModel] --output <myfile>
$ ./manage.py loaddata <path-to-myfile>

产生的fixture files可以具有不同的格式(默认情况下为json),因此易于编辑或生成,并且包含有关所引用的应用程序/模型的信息,因此易于加载。

如果您需要在各个环境之间保持一致性,请执行以下任一操作:

使用data migrations

./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);
    }
});