Opened 13 years ago
Closed 6 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 , 13 years ago
| Triage Stage: | Unreviewed → Design decision needed |
|---|
comment:2 by , 13 years ago
| Triage Stage: | Design decision needed → Accepted |
|---|
Marking as accpted, at least 50% of this is an obvious bug ;)
comment:3 by , 6 years ago
comment:4 by , 6 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.