2010-11-18 5 views
30

Je n'ai rien vu sur ce sujet dans les documents en ligne de Django. J'essaie d'enregistrer une liste d'objets dans la base de données, mais ce que je peux faire c'est faire une boucle dans la liste et appeler save() sur chaque objet.Question sur les objets sauvegardés par lots dans Django

Django a-t-il plusieurs fois touché la base de données? Ou Django fera une sauvegarde de lot à la place?

+0

Peut-être vaut-il la peine de changer la réponse acceptée maintenant que bulk_create() est disponible dans django 1.4 et up – DMTintner

Répondre

10

Malheureusement, les insertions par lots sont quelque chose que Django 1.3 et les versions antérieures ne prennent pas en charge directement. Si vous voulez utiliser l'ORM, vous devez appeler save() sur chaque objet individuel. S'il s'agit d'une grande liste et que les performances posent problème, vous pouvez utiliser django.db.cursor pour INSÉRER les éléments manuellement dans une transaction afin d'accélérer considérablement le processus. Si vous avez un grand ensemble de données, vous devez commencer à regarder des méthodes spécifiques au moteur de base de données, comme COPY FROM dans Postgres.

+3

est-ce encore vrai avec django 1.5? – maazza

+6

Non - voir la réponse ci-dessous. À partir de la version 1.4, 'bulk_create()' traitera les insertions de données en masse efficaces. (https://docs.djangoproject.com/fr/1.5/ref/models/querysets/#bulk-create) –

+1

Copy From est encore mieux que bulk_create? – sharafjaffri

1

This peut être un bon point de départ, mais comme l'auteur de l'extrait de code le dit, il pourrait ne pas être prêt pour la production.

35

Depuis Django 1.4, il existe une méthode bulk_create() sur l'objet QuerySet, qui permet d'insérer une liste d'objets dans une seule requête. Pour plus d'informations, voir:

+0

Très bien! Je devrais passer à 1.4 alors. – netvope

+0

bulk_create est génial mais, malheureusement, il ne supporte pas les modèles hérités. une idée pour gérer cela? –

+0

Notez en particulier que "[si la clé primaire du modèle est un AutoField, elle ne récupère et ne définit pas l'attribut de clé primaire, sauf save(), sauf si le backend de base de données le supporte (actuellement PostgreSQL)] (https: // docs. djangoproject.com/fr/dev/ref/models/querysets/#bulk-create) ". – Ninjakannon

2

De Django 1.4 existe bulk_create(), mais, toujours, mais.

Vous devez faire attention, en utilisant bulk_create() il n'appelle pas la méthode instance save() en interne.

Comme django docs dit

méthode save() Le modèle ne sera pas appelé

Donc, si vous surchargez méthode de sauvegarde (comme mon cas était), vous ne pouvez pas utiliser bulk_create.

Questions connexes