Opened 12 years ago
Closed 5 years ago
#18305 closed Bug (fixed)
force_update/force_insert not passed up the inheritance chain in .save()
Reported by: | Anssi Kääriäinen | 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
When saving a model, the force_update and force_insert are not passed up to parent model saves in model.save(). For example:
class Place(models.Model): name = TextField() class Restaurant(Place): serves_pizza = models.BooleanField() r = Restaurant.objects.create(name='Pizzeria pizza-kebab', serves_pizza=True) r.serves_pizza = False r.save(force_update=True)
Now, the r is updated correctly. Then, when saving the Place, the force_update isn't passed to the save_base, and thus the Place is first queried - so, the force_update isn't honored.
The same is true for force_insert. However, in this case it is possible that the force_insert is meant only for the Restaurant. You can currently do this:
p = Place.objects.create(name='p') r = Restaurant(place=p, serves_pizza=False) r.save(force_insert=True)
This would however be impossible if the force_insert would be passed up the inheritance chain.
Fixing the force_update case seems clear - however the force_insert case needs at least some consideration for backwards compatibility reasons.
Change History (4)
comment:1 by , 12 years ago
Triage Stage: | Unreviewed → Design decision needed |
---|
comment:2 by , 12 years ago
Triage Stage: | Design decision needed → Accepted |
---|
Marking as accpted, at least 50% of this is an obvious bug ;)
comment:3 by , 5 years ago
comment:4 by , 5 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
Fixed in 6b4834952dcce0db5cbc1534635c00ff8573a6d8.
Patches for force_update and force_insert fixes available at: https://github.com/akaariai/django/tree/ticket_18305 (just force_update) and https://github.com/akaariai/django/tree/ticket_18305_both (contains also force_insert).
I am marking this DDN, as I am not sure if fixing the force_insert can be considered backwards compatible. If there were a way to save only the child model (the restaurant), then this would be easier to accept, as we could add "do this instead:" to the release notes.