4

I have two django managers

Vote manager

class VoteManager(model.Manager):

    def all_with_vote_info(self):
        qs = super(VoteManager, self).get_query_set()
        qs = qs.annotate(score=Sum('votes__score', distinct=True))
        return qs

    ....

Soft Delete manager

class SoftDeleteManager(models.Manager):

    def all_active(self):
        qs = super(SoftDeleteManager, self).get_query_set()
        qs = qs.filter(time_deleted=None)
        return qs

    ....

How can I chain queryset results from VoteManager.all_with_vote_info, SoftDeleteManager.all_active, and any arbitrary number of manager methods?

coffee-grinder
  • 26,940
  • 19
  • 56
  • 82
rolnn
  • 928
  • 9
  • 16

2 Answers2

2

Found a solution: PassThroughManager

https://django-model-utils.readthedocs.org/en/latest/managers.html#passthroughmanager

Update:

PassThroughManager has been deprecated, use Django’s built-in QuerySet.as_manager() and/or Manager.from_queryset() utilities instead.

rolnn
  • 928
  • 9
  • 16
  • 2
    Could we get some examples of how we might combine two third party managers/query set using the as_manager from from_queryset methods? – ncrmro Nov 22 '17 at 12:12
0

Using this method PolymorphicQuerySet methods will all be available, then we can register additional methods from the TimeseriesQueryset

class UserPartQuerySet(PolymorphicQuerySet, TimeSeriesQuerySet):


    def prefetch_latest(self, *related_names):
        return TimeSeriesQuerySet.prefetch_latest(self, *related_names)

    def filter_outdated(self, *related_names):
        return TimeSeriesQuerySet.filter_outdated(self, *related_names)

    def update_timeseries(self, related_name, collector, force=False):
        return TimeSeriesQuerySet.update_timeseries(
                self,
                related_name,
                collector,
                force=False
        )
ncrmro
  • 177
  • 2
  • 12