Browse Source

Refs #4027 -- Added Model._state.adding to docs about copying model instances.

Johannes Wilm 4 years ago
parent
commit
0fd05df7b5
1 changed files with 8 additions and 2 deletions
  1. 8 2
      docs/topics/db/queries.txt

+ 8 - 2
docs/topics/db/queries.txt

@@ -1233,12 +1233,15 @@ 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 set ``pk`` to ``None``. Using our blog example::
+simplest case, you can set ``pk`` to ``None`` and
+:attr:`_state.adding <django.db.models.Model._state>` to ``True``. Using our
+blog example::
 
     blog = Blog(name='My blog', tagline='Blogging is easy')
     blog.save() # blog.pk == 1
 
     blog.pk = None
+    blog._state.adding = True
     blog.save() # blog.pk == 2
 
 Things get more complicated if you use inheritance. Consider a subclass of
@@ -1251,10 +1254,11 @@ Things get more complicated if you use inheritance. Consider a subclass of
     django_blog.save() # django_blog.pk == 3
 
 Due to how inheritance works, you have to set both ``pk`` and ``id`` to
-``None``::
+``None``, and ``_state.adding`` to ``True``::
 
     django_blog.pk = None
     django_blog.id = None
+    django_blog._state.adding = True
     django_blog.save() # django_blog.pk == 4
 
 This process doesn't copy relations that aren't part of the model's database
@@ -1265,6 +1269,7 @@ entry::
     entry = Entry.objects.all()[0] # some previous entry
     old_authors = entry.authors.all()
     entry.pk = None
+    entry._state.adding = True
     entry.save()
     entry.authors.set(old_authors)
 
@@ -1274,6 +1279,7 @@ For example, assuming ``entry`` is already duplicated as above::
 
     detail = EntryDetail.objects.all()[0]
     detail.pk = None
+    detail._state.adding = True
     detail.entry = entry
     detail.save()