Search code examples
djangodjango-modelsdjango-managers

Problems with django managers


I have following model:

class UserProfile(models.Model):
    """
    User profile model, cintains a Foreign Key, which links it to the
    user profile.
    """
    about = models.TextField(blank=True)
    user = models.ForeignKey(User, unique=True)
    ranking = models.IntegerField(default = 1)
    avatar = models.ImageField(upload_to="usermedia", default = 'images/js.jpg')
    updated = models.DateTimeField(auto_now=True, default=datetime.now())
    is_bot = models.BooleanField(default = False)
    is_active = models.BooleanField(default = True)
    is_free = models.BooleanField(default = True)
    objects = ProfileManager()

    def __unicode__(self):
        return u"%s profile" %self.user

And a manager

class ProfileManager(models.Manager):
    """
    Stores some additional helpers, which to get some profile data
    """
    def get_active_members(self):
        '''
        Get all people who are active
        '''
        return self.filter(is_active = True)

When, I try to call something like UserProfile.obgets.get_active_members()

I am getting the

raise AttributeError, "Manager isn't accessible via %s instances" % type.__name__

AttributeError: Manager isn't accessible via UserProfile instances

Could you please help


Solution

  • Managers are only available on model classes and not on model instances.

    This will work:

    UserProfile.objects
    

    This will not:

    profile = UserProfile.objects.get(pk=1)
    profile.objects
    

    In other words, if you are calling it on an instance of a UserProfile, it will raise the exception you see. May you confirm how you are accessing the manager?

    From the docs:

    Managers are accessible only via model classes, rather than from model instances, to enforce a separation between "table-level" operations and "record-level" operations