Opened 11 years ago
Closed 9 years ago
#21257 closed New feature (duplicate)
ForeignKey on_delete functionality should traverse (cascade, ha ha) to the DB backend
Reported by: | gcbirzan | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
By default, django creates FKs without an explicit ON DELETE on the backend. This, if nothing else, should be configurable. If for no other reason that when using some transaction isolation modes, the error returned by the backend will be the wrong one during concurrent modifications:
Table b links to table a. You insert in table b a link to ID 1 in a, at the same time as you delete it from a.
With the default (at least in PostgreSQL), in REPEATABLE READ, the error is IntegrityError, which is wrong, since in fact you should just retry the transaction. In lower isolation levels, the FK is deleted (as expected), though, granted the on delete signals are not called.
Change History (5)
comment:1 by , 11 years ago
comment:2 by , 11 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:3 by , 11 years ago
I think the URL should be https://groups.google.com/forum/#!topic/django-developers/FJMoGgtYIX4
Anyway, it is, but this doesn't involve any default behaviour change, so it should be way easier.
comment:4 by , 11 years ago
Component: | Uncategorized → Database layer (models, ORM) |
---|
This is likely related to the mailing list conversation https://docs.djangoproject.com/en/dev/ref/django-admin/#runserver-port-or-address-port and the ticket #21127. Basically the consensus seems to be that if we do push to the database it will be a new option to
on_delete
in the FK declaration. This is also likely to be bundled with the removal of a default behaviour foron_delete
.