Document that add() and remove() with a many-to-many relationship do not call Model.save()
|Reported by:||mmoya@…||Owned by:||nobody|
|Severity:||Normal||Keywords:||m2m, related manager, save|
|Has patch:||yes||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
I think there are an inconsistency in the model's save method. Suppose we are editing an existing object from the admin.
If I want to prevent saving objects (suppose I want to moderate the object), when I override the Model.save() or ModelAdmin.save_model()
the m2m relations are also saved, but what I really want to do is avoid saving any changes.
There is a simple example:
class Topping(models.Model): # ... class Pizza(models.Model): # ... toppings = models.ManyToManyField(Topping) def save(self, *args, **kwargs): return
This happens because the related m2m is commited outside the save method.
If I execute this on shell:
>>> p = Pizza.objects.get(pk=5) >>> p.foo_field 'Foo text' >>> t = Pizza.objects.get(pk=1) >>> p.foo_field = 'Bar text' >>> p.toppings.add(t)
Then, the p object have a new topping object added, but i never executed the p.save().
Change History (6)
comment:1 Changed 4 years ago by ethlinn
- Cc asendecka@… added
- Component changed from Database layer (models, ORM) to Documentation
- Needs documentation set
- Needs tests unset
- Patch needs improvement unset
- Triage Stage changed from Unreviewed to Accepted
Changed 2 years ago by timo
comment:2 Changed 2 years ago by timo
- Has patch set
- Needs documentation unset
- Summary changed from Issue with m2m relations when need to prevent saving objects to Document that add() and remove() with a many-to-many relationship do not call Model.save()
comment:3 Changed 2 years ago by Tim Graham <timograham@…>
- Resolution set to fixed
- Status changed from new to closed