def contribute_to_class(self, model, name): """ Specialization managers contribute to the model in a different way, so the code overrides what Django normally does. """ # django.db.models.options.Options does not set these fields up, so we # might have to do it ourselves: if not hasattr(model._meta, 'abstract_specialization_managers'): model._meta.abstract_specialization_managers = [] if not hasattr(model._meta, 'concrete_specialization_managers'): model._meta.concrete_specialization_managers = [] self.model = model setattr(model, name, ManagerDescriptor(self)) if (not getattr(model, '_default_specialization_manager', None) or self.creation_counter < model._default_specialization_manager.creation_counter): model._default_specialization_manager = self if model._meta.abstract or (self._inherited and not self.model._meta.proxy): model._meta.abstract_specialization_managers.append( (self.creation_counter, name, self)) else: model._meta.concrete_specialization_managers.append( (self.creation_counter, name, self))
def contribute_to_class(self, model, name): """ Newer versions of Django explicitly prevent managers being accessed from abstract classes, which is behaviour the search API has always relied on. Here we reinstate it. """ super(SearchableManager, self).contribute_to_class(model, name) setattr(model, name, ManagerDescriptor(self))
def contribute_to_class(self, model, name): self.model = model # The ManagerDescriptor attribute prevents this controller from being accessed via model instances. setattr(model, name, ManagerDescriptor(self)) models.signals.post_save.connect(self.post_save, sender=model) models.signals.post_delete.connect(self.post_delete, sender=model)
def contribute_to_class(self, model, name): if not self.name: self.name = name self.model = model opts = model._meta if DJANGO_VERSION < (1, 10): if opts.abstract: setattr(model, name, AbstractManagerDescriptor(model)) elif opts.swapped: setattr(model, name, SwappedManagerDescriptor(model)) else: setattr(model, name, ManagerDescriptor(self)) abstract = (opts.abstract or (self._inherited and not opts.proxy)) opts.managers.append((self.creation_counter, self, abstract)) else: setattr(model, name, ManagerDescriptor(self)) opts.add_manager(self)
def setup_managers(sender): from .models.managers import money_manager if VERSION >= (1, 10): for manager in filter(lambda m: m.name == 'objects', sender._meta.managers): setattr(sender, manager.name, ManagerDescriptor(money_manager(manager))) else: sender.copy_managers([ (_id, name, money_manager(manager)) for _id, name, manager in sender._meta.concrete_managers if name == 'objects' ])
def contribute_to_class(self, model, name): self.model = model if self.related_fields: def load_related(instance, *args): related_fields = args if args else self.related_fields for field in related_fields: model_field = self.model._meta.get_field_by_name(field)[0] related_pk = getattr(instance, model_field.attname) related_instance = model_field.rel.to.cache.get( pk=related_pk) if related_pk else None setattr(instance, model_field.get_cache_name(), related_instance) self.model.load_related = load_related setattr(model, name, ManagerDescriptor(self)) models.signals.post_save.connect(self._post_save, sender=model) models.signals.post_delete.connect(self._post_delete, sender=model)