Opened 5 years ago

Closed 5 years ago

#20826 closed Cleanup/optimization (fixed)

Move `Manager.raw()` and `Manager._insert()` to the QuerySet class.

Reported by: loic84 Owned by: nobody
Component: Database layer (models, ORM) Version: master
Severity: Normal Keywords:
Cc: Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no


After the introduction of #20625, most methods that involve a DB query have been removed from Manager and are automatically proxied to QuerySet, only raw() and _insert() remain. After discussion with @akaariai on IRC we came to the conclusion that it would make sense to move these to the QuerySet class as well.

The previous goal was for QuerySet to focus on retrieval, but this has somewhat failed as most methods that could belong to Manager (like create()) already live on the QuerySet class. The introduction of hybrid methods like get_or_create() or update_or_create() also demonstrates that the distinction between the different kinds of queries is not obvious to make.

If this ticket is accepted, the new objective would be defined as follows:

  • Anything "query" belongs to QuerySet.
  • Manager is responsible for the integration between a Model and a QuerySet.
  • Manager works as a hook to pre/post-process or even replace QuerySet methods when needed. (See current implementation of Manager.all() or RelatedManager.create()).

Change History (4)

comment:2 Changed 5 years ago by Tim Graham

Triage Stage: UnreviewedReady for checkin

Assuming the idea isn't rejected by someone else, the patch looks good.

comment:3 Changed 5 years ago by Anssi Kääriäinen

I think the move makes sense. .raw() belongs to queryset just as much as .create(). So, things will be a bit more consistent after the move.

comment:4 Changed 5 years ago by Tim Graham <timograham@…>

Resolution: fixed
Status: newclosed

In acd1d439fd9b3e77bc0291dcd62c09f345d8622c:

Fixed #20826 -- Moved Manager.raw() and Manager._insert() to the QuerySet class.

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