# -*- coding: utf-8 -*- """ The manager class for use in the models. """ from __future__ import unicode_literals import warnings from django.db import models from django.utils.six import python_2_unicode_compatible from polymorphic.query import PolymorphicQuerySet __all__ = ( 'PolymorphicManager', 'PolymorphicQuerySet', ) @python_2_unicode_compatible class PolymorphicManager(models.Manager): """ Manager for PolymorphicModel Usually not explicitly needed, except if a custom manager or a custom queryset class is to be used. """ # Tell Django that related fields also need to use this manager: use_for_related_fields = True queryset_class = PolymorphicQuerySet @classmethod def from_queryset(cls, queryset_class, class_name=None): manager = super(PolymorphicManager, cls).from_queryset(queryset_class, class_name=class_name) manager.queryset_class = queryset_class # also set our version, Django uses _queryset_class return manager def __init__(self, queryset_class=None, *args, **kwrags): # Up till polymorphic 0.4, the queryset class could be specified as parameter to __init__. # However, this doesn't work for related managers which instantiate a new version of this class. # Hence, for custom managers the new default is using the 'queryset_class' attribute at class level instead. if queryset_class: warnings.warn("Using PolymorphicManager(queryset_class=..) is deprecated; override the queryset_class attribute instead", DeprecationWarning) # For backwards compatibility, still allow the parameter: self.queryset_class = queryset_class super(PolymorphicManager, self).__init__(*args, **kwrags) def get_queryset(self): qs = self.queryset_class(self.model, using=self._db, hints=self._hints) if self.model._meta.proxy: qs = qs.instance_of(self.model) return qs def __str__(self): return '%s (PolymorphicManager) using %s' % (self.__class__.__name__, self.queryset_class.__name__) # Proxied methods def non_polymorphic(self): return self.all().non_polymorphic() def instance_of(self, *args): return self.all().instance_of(*args) def not_instance_of(self, *args): return self.all().not_instance_of(*args) def get_real_instances(self, base_result_objects=None): return self.all().get_real_instances(base_result_objects=base_result_objects)