Проблемы с менеджерами Django - PullRequest
0 голосов
/ 18 сентября 2009

У меня есть следующая модель:

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

И менеджер

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)

Когда я пытаюсь вызвать что-то вроде UserProfile.obgets.get_active_members ()

Я получаю

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

AttributeError: Менеджер не доступен через экземпляры UserProfile

Не могли бы вы помочь

Ответы [ 2 ]

6 голосов
/ 18 сентября 2009

Менеджеры доступны только для классов моделей и , а не для экземпляров моделей.

Это будет работать:

UserProfile.objects

Это не будет:

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

Другими словами, если вы вызываете его для экземпляра из UserProfile, это вызовет исключение, которое вы видите. Можете ли вы подтвердить, как вы обращаетесь к менеджеру?

Из документов :

Менеджеры доступны только через классы модели, а не из экземпляров модели, чтобы обеспечить разделение между операциями на уровне таблицы и операциями на уровне записи

1 голос
/ 18 сентября 2009
class ActiveUserProfileManager(models.Manager):
        def get_query_set( self ):        
            return super( ActiveUserProfileManager , self ).get_query_set().filter(active=True, something=True)


class UserProfile(models.Model):
    objects = models.Manager()
    active_profiles = ActiveUserProfileManager()


UserProfile.active_profiles.all()
UserProfile.active_profiles.filter(id=1)
UserProfile.active_profiles.latest()
...