Opened 5 months ago
Closed 5 months ago
#35551 closed Bug (wontfix)
Fix changing PK via admin
Reported by: | Csirmaz Bendegúz | Owned by: | Csirmaz Bendegúz |
---|---|---|---|
Component: | contrib.admin | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
I have noticed two bugs when changing the primary key field via admin.
Given:
# models.py class Dummy(models.Model): id = models.IntegerField(primary_key=True) # admin.py admin.site.register(Dummy)
- Create Dummy (1), Dummy (2).
- Change Dummy (2)'s Id field -> 1
- Dummy (1) is overwritten with Dummy (2), Dummy(2) stays unchanged.
- Change Dummy (1)'s Id field -> 3
- A new Dummy (3) is created, Dummy (1) stays unchanged.
I believe both step 3 and step 5 are bugs.
Change History (12)
comment:1 by , 5 months ago
Description: | modified (diff) |
---|
comment:2 by , 5 months ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:3 by , 5 months ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:4 by , 5 months ago
So actually there are 2 issues:
- The unique check is skipped when PK is changed.
- The object is duplicated when PK is changed.
I'm looking into this.
comment:5 by , 5 months ago
Description: | modified (diff) |
---|
comment:6 by , 5 months ago
Description: | modified (diff) |
---|
comment:7 by , 5 months ago
Has patch: | set |
---|
comment:8 by , 5 months ago
I have submitted a basic fix for raising a ValidationError on PK conflict.
The other issue I would like to address is the fact that Django creates a duplicate if there's no PK conflict.
This should also resolve the race condition issue, i.e. what if an object is created by a separate process with the same PK after this check passes. It would still get overwritten like Sarah mentioned.
At the very least, an IntegrityError should be raised in that case.
Should I create another ticket for this?
comment:10 by , 5 months ago
Description: | modified (diff) |
---|---|
Summary: | Unique checks skipped when changing primary key → Fix changing PK via admin |
I edited the ticket to reflect my findings.
follow-up: 12 comment:11 by , 5 months ago
I'm not sure that trying to allow editing primary keys is the right course of action. There is a long discussion in #2259 (which I didn't read in detail).
comment:12 by , 5 months ago
Cc: | removed |
---|---|
Resolution: | → wontfix |
Status: | assigned → closed |
Replying to Tim Graham:
I'm not sure that trying to allow editing primary keys is the right course of action. There is a long discussion in #2259 (which I didn't read in detail).
I see, thanks. I read #2259 - the issue is not with editing the primary keys, but with all the foreign keys that refer to it.
It's because Django doesn't support ON UPDATE in foreign keys (neither on the DB level, nor on the ORM level).
So yes, the simplest solution would be to disable editing primary keys via the admin.
Great catch thank you!
Agreed 👍 if you were to add another field to the model then you slightly override
Dummy (1)
with whatever is inDummy (2)
- which is not nice.