2017-01-30 23:13:32 +01:00
|
|
|
"""
|
|
|
|
Un mixin à utiliser avec BaseCommand pour charger des objets depuis un json
|
|
|
|
"""
|
|
|
|
|
|
|
|
import json
|
2018-10-06 12:35:49 +02:00
|
|
|
import os
|
2017-01-30 23:13:32 +01:00
|
|
|
|
|
|
|
from django.core.management.base import BaseCommand
|
|
|
|
|
|
|
|
|
|
|
|
class MyBaseCommand(BaseCommand):
|
|
|
|
"""
|
|
|
|
Ajoute une méthode ``from_json`` qui charge des objets à partir d'un json.
|
|
|
|
"""
|
|
|
|
|
2018-10-06 12:35:49 +02:00
|
|
|
def from_json(self, filename, data_dir, klass, callback=lambda obj: obj):
|
2017-01-30 23:13:32 +01:00
|
|
|
"""
|
|
|
|
Charge les objets contenus dans le fichier json référencé par
|
|
|
|
``filename`` dans la base de donnée. La fonction callback est appelées
|
|
|
|
sur chaque objet avant enregistrement.
|
|
|
|
"""
|
|
|
|
self.stdout.write("Chargement de {:s}".format(filename))
|
2018-10-06 12:35:49 +02:00
|
|
|
with open(os.path.join(data_dir, filename), "r") as file:
|
2017-01-30 23:13:32 +01:00
|
|
|
descriptions = json.load(file)
|
|
|
|
objects = []
|
|
|
|
nb_new = 0
|
|
|
|
for description in descriptions:
|
|
|
|
qset = klass.objects.filter(**description)
|
|
|
|
try:
|
|
|
|
objects.append(qset.get())
|
|
|
|
except klass.DoesNotExist:
|
|
|
|
obj = klass(**description)
|
|
|
|
obj = callback(obj)
|
|
|
|
obj.save()
|
|
|
|
objects.append(obj)
|
|
|
|
nb_new += 1
|
|
|
|
self.stdout.write("- {:d} objets créés".format(nb_new))
|
2018-10-06 12:35:49 +02:00
|
|
|
self.stdout.write(
|
|
|
|
"- {:d} objets gardés en l'état".format(len(objects) - nb_new)
|
|
|
|
)
|
2017-01-30 23:13:32 +01:00
|
|
|
return objects
|