2009-09-18 8 views
0

Je modèle suivant:Problèmes avec les gestionnaires de django

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 

Et un gestionnaire

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) 

Quand j'essaie d'appeler quelque chose comme UserProfile.obgets.get_active_members()

Je suis obtenir le

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

AttributeError: Manager n'est pas accessible par les instances UserProfile

Pourriez-vous s'il vous plaît aider

Répondre

6

Les gestionnaires ne sont disponibles que sur les classes de modèle et pas sur les instances de modèle.

Cela fonctionne:

UserProfile.objects 

Ce ne sera pas:

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

En d'autres termes, si vous appelez sur un exemple d'un UserProfile, il soulèvera l'exception que vous voir. Pouvez-vous confirmer comment vous accédez au gestionnaire?

De l'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

1
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() 
Questions connexes