﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
33312	Instances with deferred fields cannot be used for copying.	Adam Sołtysik	Simon Charette	"As per [https://docs.djangoproject.com/en/3.2/topics/db/queries/#copying-model-instances documentation], it's possible to clone objects by setting `pk = None`.

However, if the object to clone comes from a deferred queryset (after calling `defer` or `only`), trying to save the copy raises some hard to decipher exceptions.

{{{
class DeferCloneTest(TestCase):
    @classmethod
    def setUpTestData(cls):
        SimpleItem.objects.create(name=""test"", value=42)

    def _get_item(self):
        item = SimpleItem.objects.defer('value').first()  # same with `only` instead of `defer`
        item.pk = None
        item._state.adding = True  # doesn't seem to change anything
        return item

    def test_save(self):
        self._get_item().save()  # ValueError: Cannot force an update in save() with no primary key.

    def test_save_force_insert(self):
        self._get_item().save(force_insert=True)  # SimpleItem.DoesNotExist

    def test_bulk_create(self):
        SimpleItem.objects.bulk_create([self._get_item()])  # SimpleItem.DoesNotExist
}}}

Possibly related: #27419, #28019."	Cleanup/optimization	closed	Database layer (models, ORM)	3.2	Normal	fixed		Egor R	Ready for checkin	1	0	0	0	0	0
