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

Axi*_*xil 7 python django seed django-queryset

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

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

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

有类似的东西吗?

Mar*_*eca 20

根据django 3.1 docs您可以通过创建夹具来为数据库做种。如果您已经有了一些数据,那么创建夹具的最直接方法是使用该manage.py dumpdata命令。例如

python3 manage.py dumpdata <app_name>.<model_name>  > ./fixtures/<model_name>.json
Run Code Online (Sandbox Code Playgroud)

或者,您可以手动编写设备;固定装置可以编写为 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"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

这是与 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
Run Code Online (Sandbox Code Playgroud)

您将将此数据存储在应用程序内的 fixtures 目录中。

加载数据很容易:只需call manage.py loaddata <fixturename><fixturename>您创建的夹具文件的名称在哪里。

  • XXX:夹具不支持迁移。如果您的模型经常更改,请勿使用它们,否则您将必须在每次模型更改时重新生成装置。 (4认同)

anu*_*rag 9

与Rails类似,我们也可以选择为数据库设置种子。这是使用管理命令完成的。在您的一个应用中,使用以下文件夹结构

<project>/<app>/management/commands/seed.py
Run Code Online (Sandbox Code Playgroud)

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

""" Clear all data and creates addresses """
MODE_REFRESH = 'refresh'

""" Clear all data and do not create any object """
MODE_CLEAR = 'clear'

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()
Run Code Online (Sandbox Code Playgroud)

在上面的结构中,您可以添加自定义模式,并进行相应的种子设置。另外,您可以添加其他管理命令参数(例如number_of_addresses并将其传递给种子运行。命令为python manage.py seed --mode=refresh --number_of_addresses=15)。

希望这可以帮助。干杯!


小智 6

我正在使用这个库

https://pypi.org/project/django-seed/

from django_seed import Seed

seeder = Seed.seeder()

from myapp.models import Game, Player
seeder.add_entity(Game, 5)
seeder.add_entity(Player, 10)

inserted_pks = seeder.execute()
Run Code Online (Sandbox Code Playgroud)


Mat*_*ers 5

有多种方法可以向 Django 提供种子数据:

如果您正在进行原型设计并且还不关心维护跨环境的一致性,那么使用 Django 的dumpdataloaddata非常简单快捷:

$ ./manage.py dumpdata myApp.MyModel [myApp.AnotherModel] --output <myfile>
$ ./manage.py loaddata <path-to-myfile>
Run Code Online (Sandbox Code Playgroud)

生成的夹具文件可以是不同的格式(默认为 json),因此它们很容易编辑或生成,并且它们包含有关它们引用的应用程序/模型的信息,因此它们很容易加载。

如果您需要保持跨环境的一致性,可以:

使用数据迁移

./manage.py makemigrations --empty <myapp> --name seed_<my_model>
Run Code Online (Sandbox Code Playgroud)

或者根据 @anurag 的答案添加自定义管理命令


小智 3

您可以创建数据迁移... https://docs.djangoproject.com/en/2.0/topics/migrations/#data-migrations

python manage.py makemigrations --empty appname
Run Code Online (Sandbox Code Playgroud)