• Loic Bistuer's avatar
    Fixed #21169 -- Reworked RelatedManager methods use default filtering · 17c3997f
    Loic Bistuer yazdı
    The `remove()` and `clear()` methods of the related managers created by
    `ForeignKey`, `GenericForeignKey`, and `ManyToManyField` suffered from a
    number of issues. Some operations ran multiple data modifying queries without
    wrapping them in a transaction, and some operations didn't respect default
    filtering when it was present (i.e. when the default manager on the related
    model implemented a custom `get_queryset()`).
    
    Fixing the issues introduced some backward incompatible changes:
    
    - The implementation of `remove()` for `ForeignKey` related managers changed
      from a series of `Model.save()` calls to a single `QuerySet.update()` call.
      The change means that `pre_save` and `post_save` signals aren't called anymore.
    
    - The `remove()` and `clear()` methods for `GenericForeignKey` related
      managers now perform bulk delete so `Model.delete()` isn't called anymore.
    
    - The `remove()` and `clear()` methods for `ManyToManyField` related
      managers perform nested queries when filtering is involved, which may
      or may not be an issue depending on the database and the data itself.
    
    Refs. #3871, #21174.
    
    Thanks Anssi Kääriäinen and Tim Graham for the reviews.
    17c3997f
models.py 4.99 KB