#29871: Resetting primary key for a derived object does not work
-------------------------------------+-------------------------------------
Reporter: Victor Porton | Owner: nobody
Type: Bug | Status: closed
Component: Database layer | Version: 2.1
(models, ORM) |
Severity: Normal | Resolution: invalid
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Comment (by Simon Charette):
Thanks for the extra details Victor.
Could you confirm that the following patch work for you when setting
`self.pk = None` in `reset()`.
{{{
diff --git a/django/db/models/base.py b/django/db/models/base.py
index 751f42bb9b..535928ce05 100644
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ -553,7 +553,11 @@ class Model(metaclass=ModelBase):
return getattr(self, meta.pk.attname)
def _set_pk_val(self, value):
- return setattr(self, self._meta.pk.attname, value)
+ field = self._meta.pk
+ setattr(self, field.attname, value)
+ while getattr(field, 'parent_link', False):
+ field = field.target_field
+ setattr(self, field.attname, value)
pk = property(_get_pk_val, _set_pk_val)
}}}
This code should make sure that setting `self.pk = None` does
`self.item_ptr_id = self.id = None` for any level of concrete model
inheritance. That should be enough for `save()` to create new objects from
my local testing.
--
Ticket URL: <https://code.djangoproject.com/ticket/29871#comment:7>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/065.9bce2467efddfb8954aa0759935d029e%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.