300 votes

Comment cloner un objet instance de Django modèle et enregistrez-le à la base de données ?

<pre><code></code><p>Dans la base de données, je tiens à ajouter un autre objet qui est une copie de l’objet ci-dessus.</p><p>Supposons que mon tableau comporte une seule ligne. Je veux insérer l’objet premier de la ligne dans une autre ligne avec une clé primaire différente. Comment puis-je faire ?</p></pre>

526voto

miah Points 2137

Il suffit de modifier la clé primaire de votre objet et exécutez save().

Si vous souhaitez que la clé générée automatiquement, définissez la clé de nouvelle voix contre zéro.

Plus sur UPDATE/INSERT ici.

147voto

S. Kirby Points 1812

La documentation de Django pour les requêtes de base de données comprend une section sur la copie d'instances de modèle. En supposant que vos clés primaires sont générés automatiquement, l'idée est de définir la clé primaire à Aucun avant d'enregistrer, comme dans miah de réponse:

blog = Blog(name='My blog', tagline='Blogging is easy')
blog.save() # blog.pk == 1

blog.pk = None
blog.save() # blog.pk == 2

(La première save() crée un objet original, et le deuxième save() crée une copie.)

Si vous continuez à lire, il y a aussi des exemples sur la façon de gérer les deux cas plus complexes: (1) la copie d'un objet qui est une instance d'un modèle de sous-classe, et (2) la copie d'objets connexes, y compris les objets de type plusieurs-à-plusieurs relations.

Note historique: Ce n'était pas expliqué dans le Django docs jusqu'à la version 1.4. Il a été possible depuis avant la 1.4.

Possible des fonctionnalités à venir: celui-ci docs changement a été fait dans ce billet. Sur le billet du fil de commentaires, il y a aussi une discussion sur l'ajout d'un haut- copy fonction pour les classes du modèle, mais autant que je sache, ils ont décidé de ne pas s'attaquer à ce problème. Donc, ce "manuel" mode de copie aurez probablement à faire pour l'instant.

50voto

Troy Grosfield Points 229

Soyez prudent ici. Cela peut être extrêmement coûteux si vous êtes dans une boucle de quelque sorte et vous êtes récupérer les objets un par un. Si vous ne voulez pas l’appel à la base de données, juste faire :

Il fait la même chose que certains de ces autres réponses, mais il n’a pas la base de données appelle pour récupérer un objet. C’est également utile si vous voulez faire une copie d’un objet qui n’existe pas encore dans la base de données.

20voto

Dominic Rodger Points 44489

Il y a un extrait de clone ici, que vous pourrez ajouter à votre modèle qui fait ceci :

20voto

Michael Bylstra Points 830

Comment faire cela a été ajouté aux docs officiels de Django dans Django1.4

https://docs.djangoproject.com/en/1.4/topics/DB/Queries/#Copying-Model-instances

La réponse officielle est similaire à la réponse de miah, mais les docs soulignent quelques difficultés avec l’héritage et les objets liés, donc vous devriez probablement Assurez-vous de que lire les docs.

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