2010-01-25 5 views
1
class SupercalifragilisticexpialidociousManager(models.Manager): 
    # Sorry, I'm sick of Foo and Spam for now. 
    def get_query_set(self, account=None): 
     return super(SupercalifragilisticexpialidociousManager, 
        self).get_query_set().filter(uncle=model_thats_using_this_manager_instance.uncle) 

La magie que je cherche est "uncle = model_thats_using_this_manager_instance.uncle". Il semble que je devrais être capable de le faire en quelque sorte. Je sais que je pourrais dire self.model pour obtenir le modèle, mais comment obtenir l'instance?Django: Comment accéder à l'instance d'un modèle depuis un gestionnaire?

Répondre

5

Cela ne sert à rien de demander une instance lorsque vous utilisez un gestionnaire. Les gestionnaires sont des attributs de niveau classe - si vous essayez de faire foo.objects.all()foo est une instance de Supercalifragilisticexpialidocious, vous explicitement obtiendrez une erreur:

AttributeError: Manager isn't accessible via Supercalifragilisticexpialidocious instances 
+0

Merci Daniel. Votre exemple m'a aidé à comprendre le contexte dans lequel les gestionnaires existent. J'ai encore besoin de trouver un moyen de mieux gérer cette situation à l'échelle de l'application plutôt que d'avoir à écrire un code spécial ici et là. – orokusaki

3

Pour autant que je sache, vous ne pouvez pas accéder au modèle à l'intérieur d'un gestionnaire . Cela n'a aucun sens puisque les gestionnaires opèrent sur toute la table.

Vous devriez faire quelque chose comme ça dans le modèle:

class Model(models.Model): 
    # some attributes here 
    def getAllRelativesWithSameUncle(self): 
     return Model.objects.filter(uncle = self.uncle) 

ou dans le gestionnaire:

class SupercalifragilisticexpialidociousManager(models.Manager): 
    def getSelfRelativesFor(self, model): 
     return self.get_queryset().filter(uncle=model) 
+1

la méthode du modèle a beaucoup plus de sens –

+0

Je pense que vous vouliez dire oncle = model_instance et (self, model_instance) plutôt que d'utiliser le modèle lui-même comme attribut de filtrage. – orokusaki

+0

Bien sûr, c'est pourquoi il est écrit en minuscules;) (J'avoue que cela pourrait être mal compris). L'a changé .... –

Questions connexes