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

This commit is contained in:
Johannes Wilm 2021-02-19 19:53:43 +01:00 committed by Mariusz Felisiak
parent 8f02a78695
commit 0fd05df7b5
1 changed files with 8 additions and 2 deletions

View File

@ -1233,12 +1233,15 @@ Copying model instances
Although there is no built-in method for copying model instances, it is 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 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 = Blog(name='My blog', tagline='Blogging is easy')
blog.save() # blog.pk == 1 blog.save() # blog.pk == 1
blog.pk = None blog.pk = None
blog._state.adding = True
blog.save() # blog.pk == 2 blog.save() # blog.pk == 2
Things get more complicated if you use inheritance. Consider a subclass of 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 django_blog.save() # django_blog.pk == 3
Due to how inheritance works, you have to set both ``pk`` and ``id`` to 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.pk = None
django_blog.id = None django_blog.id = None
django_blog._state.adding = True
django_blog.save() # django_blog.pk == 4 django_blog.save() # django_blog.pk == 4
This process doesn't copy relations that aren't part of the model's database 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 entry = Entry.objects.all()[0] # some previous entry
old_authors = entry.authors.all() old_authors = entry.authors.all()
entry.pk = None entry.pk = None
entry._state.adding = True
entry.save() entry.save()
entry.authors.set(old_authors) entry.authors.set(old_authors)
@ -1274,6 +1279,7 @@ For example, assuming ``entry`` is already duplicated as above::
detail = EntryDetail.objects.all()[0] detail = EntryDetail.objects.all()[0]
detail.pk = None detail.pk = None
detail._state.adding = True
detail.entry = entry detail.entry = entry
detail.save() detail.save()