Bulk crée des objects de modèle dans django

J’ai beaucoup d’objects à enregistrer dans la firebase database et je veux créer des instances de modèle avec cela.

Avec django, je peux créer toutes les instances de modèles, avec MyModel(data) , puis les enregistrer toutes.

Actuellement, j’ai quelque chose comme ça:

 for item in items: object = MyModel(name=item.name) object.save() 

Je me demande si je peux enregistrer une liste d’objects directement, par exemple:

 objects = [] for item in items: objects.append(MyModel(name=item.name)) objects.save_all() 

Comment enregistrer tous les objects en une seule transaction?

à partir de la version 1.4 de django development, il existe la bulk_create comme gestionnaire d’object qui prend en entrée un tableau d’objects créés à l’aide du constructeur de classe. Découvrez les django docs

Utilisez la méthode bulk_create (). Il est maintenant standard dans Django: Documentation officielle Django bulk_create ()

Exemple:

 >>> Entry.objects.bulk_create([ ... Entry(headline="Django 1.0 Released"), ... Entry(headline="Django 1.1 Announced"), ... Entry(headline="Breaking: Django is awesome") ... ]) 

a travaillé pour moi d’utiliser la gestion manuelle des transactions pour la boucle (postgres 9.1):

 from django.db import transaction with transaction.commit_on_success(): for item in items: MyModel.objects.create(name=item.name) 

en fait, ce n’est pas la même chose que l’insertion en masse de la firebase database «native», mais cela vous permet d’éviter / de diminuer les coûts de transport / orms / sql query analysis

Utiliser create provoquera une requête par nouvel élément. Si vous souhaitez réduire le nombre de requêtes INSERT, vous devez utiliser autre chose.

J’ai eu un certain succès en utilisant l’extrait Bulk Insert, même si l’extrait de code est assez ancien. Certains changements sont peut-être nécessaires pour que cela fonctionne à nouveau.

http://djangosnippets.org/snippets/446/

Découvrez cet article sur le module vrac

Sur mon application django 1.3, j’ai connu une accélération significative.

Voici comment créer en bloc des entités à partir de fichiers séparés par des colonnes, en laissant de côté toutes les routines non équivoques et non classées:

 SomeModel(Model): @classmethod def from_file(model, file_obj, headers, delimiter): model.objects.bulk_create([ model(**dict(zip(headers, line.split(delimiter)))) for line in file_obj], batch_size=None) 

pour une implémentation sur une seule ligne, vous pouvez utiliser une expression lambda dans une carte

 map(lambda x:MyModel.objects.get_or_create(name=x), items) 

Ici, lambda met en correspondance chaque élément de la liste d’éléments avec x et crée un enregistrement de firebase database si nécessaire.

Documentation Lambda

La méthode la plus simple consiste à utiliser la méthode create Manager, qui crée et enregistre l’object en une seule étape.

 for item in items: MyModel.objects.create(name=item.name)