Document that add() and remove() with a many-to-many relationship do not call Model.save()
|Reported by:||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 5 years ago by
|Component:||Database layer (models, ORM) → Documentation|
|Patch needs improvement:||unset|
|Triage Stage:||Unreviewed → Accepted|
comment:2 Changed 3 years ago by
|Summary:||Issue with m2m relations when need to prevent saving objects → Document that add() and remove() with a many-to-many relationship do not call Model.save()|