Opened 4 years ago
Last modified 8 months ago
#31583 new New feature
Extend deferred unique constraint support to OneToOneField
Reported by: | BorisZZZ | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | Normal | Keywords: | DEFERRED |
Cc: | Ian Foote, Petr Přikryl | Triage Stage: | Someday/Maybe |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Support for DEFERRABLE INITIALLY DEFERRED was added in https://code.djangoproject.com/ticket/20581 . It would be great if it could be extended to the implicit Unique constraint generated by OneToOneField
, say, by adding an argument:
OneToOneField(OtherModel, defer=models.Deferrable.DEFERRED)
Change History (5)
comment:1 by , 4 years ago
Triage Stage: | Unreviewed → Someday/Maybe |
---|
comment:2 by , 4 years ago
Cc: | added |
---|
comment:3 by , 3 years ago
Cc: | added |
---|
comment:4 by , 3 years ago
I think it would be quite easy. Here we could pass deferrable
argument based on new_field.defer
value:
https://github.com/django/django/blob/4.0/django/db/backends/base/schema.py#L810
https://github.com/django/django/blob/4.0/django/db/backends/base/schema.py#L1245
comment:5 by , 8 months ago
There is a use case for this, ordering of database rows using a linked list. OneToOne can be used to define the field pointing to the previous row, but the associated constraint needs to be deferred to allow for updates that temporarily violate the constraint while changing the row ordering.
We were able to implement this, but it involved a workaround. Specifically we had to manually delete the constraint created by the OneToOne and then recreate it with deferred in our migrations, then add that constraint to the model definition also.
Not sure we should do that as it seems pretty niche.
I guess an alternative API could be to allow passing a
UniqueConstraint
to theunique
kwarg like we've discussed doing to theField.index
one.e.g.