Opened 5 months ago

Closed 4 months ago

#29447 closed Bug (fixed)

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

Reported by: Jeremy Lainé Owned by: Alexandr Tatarinov
Component: Database layer (models, ORM) Version: 2.0
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes 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 (6)

comment:1 Changed 5 months ago by Jeremy Lainé

Description: modified (diff)

comment:2 Changed 4 months ago by Alexandr 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.

comment:3 Changed 4 months ago by Tim Graham

Triage Stage: UnreviewedAccepted

comment:4 Changed 4 months ago by Alexandr Tatarinov

Owner: changed from nobody to Alexandr Tatarinov
Status: newassigned

comment:5 Changed 4 months ago by Alexandr Tatarinov

Has patch: set

comment:6 Changed 4 months ago by Tim Graham <timograham@…>

Resolution: fixed
Status: assignedclosed

In 74106185:

Fixed #29447 -- Made RelatedManager.set() pass bulk argument to clear().

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