summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorLuke Plant <L.Plant.98@cantab.net>2011-11-01 21:44:18 +0000
committerLuke Plant <L.Plant.98@cantab.net>2011-11-01 21:44:18 +0000
commita97ecfdea80080da7e522d8dd8a4792a777694f9 (patch)
treec7c50597c15b8618d7eba3c619fffc4a29f51859 /docs
parent3b7a4c6adc0b709bf08679b9b3299af512166626 (diff)
Fixed #4027 - Document how to make copies of model instances
Thanks to Marek Kubica for the report and initial patch, and to oinopion and erikr for work on the patch. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17064 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'docs')
-rw-r--r--docs/topics/db/queries.txt40
1 files changed, 40 insertions, 0 deletions
diff --git a/docs/topics/db/queries.txt b/docs/topics/db/queries.txt
index 58a7cf1c82..345687e494 100644
--- a/docs/topics/db/queries.txt
+++ b/docs/topics/db/queries.txt
@@ -828,6 +828,46 @@ complete query set::
Entry.objects.all().delete()
+.. _topics-db-queries-copy:
+
+Copying model instances
+=======================
+
+Although there is no built-in method for copying model instances, it is
+possible to easily create new instance with all fields' values copied. In the
+simplest case, you can just set ``pk`` to ``None``. Using our blog example::
+
+ blog = Blog(name='My blog', tagline='Blogging is easy')
+ blog.save() # post.pk == 1
+
+ blog.pk = None
+ blog.save() # post.pk == 2
+
+Things get more complicated if you use inheritance. Consider a subclass of
+``Blog``::
+
+ class ThemeBlog(Blog):
+ theme = models.CharField(max_length=200)
+
+ django_blog = ThemeBlog(name='Django', tagline='Django is easy', theme = 'python')
+ django_blog.save() # django_blog.pk == 3
+
+Due to how inheritance works, you have to set both ``pk`` and ``id`` to None::
+
+ django_blog.pk = None
+ django_blog.id = None
+ django_blog.save() # django_blog.pk == 4
+
+This process does not copy related objects. If you want to copy relations,
+you have to write a little bit more code. In our example, ``Entry`` has a many to many
+field to ``Author``::
+
+ entry = Entry.objects.all()[0] # some previous entry
+ old_authors = entry.authors.all()
+ entry.pk = None
+ entry.save()
+ entry.authors = old_authors # saves new many2many relations
+
.. _topics-db-queries-update:
Updating multiple objects at once