Opened 3 weeks ago

Last modified 9 days ago

#29447 new Bug

RelatedManager.set() doesn't pass bulk keyword argument to clear()

Reported by: Jeremy Lainé Owned by: nobody
Component: Database layer (models, ORM) Version: 2.0
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Jeremy Lainé)

For reverse many-to-one relations, the set method's bulk keyword argument is passed down to the add() and remove() methods. It isn't however passed down to the clear() method:

https://github.com/django/django/blob/265506bbc347a6b3fcc6c66ab1a2417b3b7ea57a/django/db/models/fields/related_descriptors.py#L711

This looks like a bug, as passing bulk=False, clear=True results in the following behavior:

  • clear() is invoked in "bulk" mode, not triggering signals
  • add() is invoked in "non-bulk" mode, signals are triggered

Admitedly, I'm not too sure why you would want to do this, but at the very least the docs should mention if this combination is unsupported.

I spotted this while reading the related_descriptors.py code to fix #29440.

Change History (2)

comment:1 Changed 3 weeks ago by Jeremy Lainé

Description: modified (diff)

comment:2 Changed 9 days ago by Alexander Tatarinov

I would like to work on this if confirmed as bug. Seems pretty straightforward to fix. Also I think we should add some tests to check number of queries issued.

Note: See TracTickets for help on using tickets.
Back to Top