web-dev-qa-db-fra.com

Comment amorcer Django? - insérer un tas de données dans le projet pour l'initialisation

J'avais développé en Django et je me demandais s'il y avait un moyen de semer des données dans la base de données dans Django.

Dans Ruby on Rails, j'utilise seed.rb et ensuite j'exécute "rake db: seed" en ligne de commande.

Principale raison pour laquelle je veux semer des données sur les statuts, les types, etc. pour l'initialisation du projet.

Y a-t-il quelque chose de similaire?

7
Axil

Semblable à Rails, nous avons également la possibilité d'amorcer la base de données. Cela se fait en utilisant commandes de gestion . Dans l'une de vos applications, utilisez la structure de dossiers suivante

<project>/<app>/management/commands/seed.py

cela fait python manage.py seed disponible en tant que commande de gestion. Personnellement, je suis la structure suivante.

# <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()

Dans la structure ci-dessus, vous pouvez ajouter des modes personnalisés et amorcer en conséquence. Vous pouvez également ajouter des arguments de commande de gestion supplémentaires (par exemple, number_of_addresses et les transmettre pour exécuter l'amorçage. La commande serait python manage.py seed --mode=refresh --number_of_addresses=15).

J'espère que cela t'aides. À votre santé!

9
anurag

Selon Django 2.2 docs Vous pouvez amorcer votre base de données en créant des fixtures. La façon la plus simple de créer un appareil si vous avez déjà des données consiste à utiliser la commande manage.py dumpdata. Ou, vous pouvez écrire des appareils à la main; les appareils peuvent être écrits en JSON, XML ou YAML.

À titre d'exemple, voici à quoi pourrait ressembler un appareil pour un modèle Personne simple en 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"
    }
  }
]

Et voici ce même appareil que 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

Vous stockerez ces données dans un répertoire d'appareils à l'intérieur de votre application.

Le chargement des données est facile: juste call manage.py loaddata <fixturename>, où <fixturename> est le nom du fichier d'installation que vous avez créé.

2
Marcelo Fonseca

J'utilise cette lib

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()
1
Edilton Danniken

Vous pouvez créer une migration de données .... https://docs.djangoproject.com/en/2.0/topics/migrations/#data-migrations

python manage.py makemigrations --empty appname
1
0of1