126 votes

Comment créer en bloc des objets de modèle dans Django

J'ai beaucoup d'objets à enregistrer dans la base de données, et je veux donc 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 je veux 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 directement une liste d'objets, par exemple:

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

Pour enregistrer tous les objets en une seule transaction. une idée de faire ça? Merci !

125voto

ecbtln Points 770

à partir de la version 1.4 de développement de django, il existe bulk_create comme méthode de gestion d'objets qui prend en entrée un tableau d'objets créés à l'aide du constructeur de classe. consultez la documentation de django

6voto

eviltnan Points 755

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 base de données «native», mais cela vous permet d'éviter / de diminuer le transport / les opérations orms / la requête SQL analyser les coûts

3voto

OmerGertel Points 1507

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

J'ai réussi à utiliser l'extrait d'insertion en bloc, même s'il est assez ancien. Peut-être que certains changements sont nécessaires pour le faire fonctionner à nouveau.

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

2voto

MrJ Points 143

Découvrez cet article de blog sur le module bulkops .

Sur mon application django 1.3, j'ai connu une accélération importante.

-1voto

FallenAngel Points 5887

pour une implémentation sur une seule ligne, vous pouvez utiliser lambda ...

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

Ici, lambda fait correspondre chaque élément de la liste d'éléments à x et crée un enregistrement de base de données ...

Documentation Lambda

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X