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?
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é!
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éé.
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()
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