2009-05-06 7 views
3

Dans le code suivant, je suis en train de créer la méthode show_pro qui montrera tous les arguments pour le cas qui sont pro.en utilisant django, comment créer une méthode dans un modèle pour renvoyer des données de requête

Je reçois cette erreur:

>>> Case.objects.all()[0].show_pro() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/john/mysite/../mysite/cases/models.py", line 23, in show_pro 
    return self.objects.filter(argument__side__contains='p') 
    File "/usr/lib/python2.5/site-packages/django/db/models/manager.py", line 151, in __get__ 
    raise AttributeError, "Manager isn't accessible via %s instances" % type.__name__ 
AttributeError: Manager isn't accessible via Case instances 

Voici le code:

from django.db import models 
from django.contrib.auth.models import User 
import datetime 

SIDE_CHOICES = (
     ('p', 'pro'), 
     ('c', 'con'), 
     ('u', 'undecided'), 
    ) 



    class Case(models.Model): 
     question = models.CharField(max_length=200) 
     owner = models.ForeignKey(User) 
     pub_date = models.DateTimeField('date published') 
     rating = models.IntegerField() 
     def __unicode__(self): 
      return self.question 
     def was_published_today(self): 
      return self.put_date.date() == datetime.date.today() 
     def show_pro(self): 
      return self.objects.filter(argument__side__contains='p') 

    class Argument(models.Model): 
     case = models.ForeignKey(Case) 
     reason = models.CharField(max_length=200) 
     rating = models.IntegerField() 
     owner = models.ForeignKey(User) 
     side = models.CharField(max_length=1, choices=SIDE_CHOICES) 
     def __unicode__(self): 
      return self.reason 

Répondre

8

Essayez:

def show_pro(self): 
    return self.argument_set.filter(side='p') 

Fondamentalement, vous devez faire une recherche inversée sur le ForeignKey relation, puis filtrer pour obtenir les objets Argument associés qui ont side='p'.

Dans la fonction show_pro, self n'est pas un QuerySet, il fait référence à l'objet lui-même.

+0

se réfère à Case droit? Je peux faire Case.objects de l'extérieur de la classe pourquoi pas self.objects à l'intérieur? – Johnd

1

Vous ne pouvez pas appeler self.objects, objects est un membre de classe, pas un champ sur l'instance. Pensez-y de cette façon, aurait-il un sens de faire:

c0 = Case.objects.all()[0] 
c1 = c0.objects.all()[1] 

Pas vraiment. C'est ce que fait self. Au lieu de cela, vous devez accéder aux champs d'instance. Comme Tyson suggéré:

class Case(models.Model): 
    ... 
    def show_pro(self): 
     return self.argument_set.filter(side='p') 
    ... 
+0

wow, on dirait que j'ai besoin de rafraîchir sur Python ou mes compétences OO. Pourquoi ne puis-je pas appeler un membre de la classe (qui est appelable) à l'intérieur d'un cours? – Johnd

+0

En général, vous pouvez accéder aux attributs de classe à partir de l'instance, mais dans le cas des gestionnaires de jeux de requêtes, Django [l'empêche explicitement] (https://github.com/django/django/blob/104ee2fdae7fcd402396c709c91f5c84de6e4165/django/db/models/manager .py # L186). – practual

Questions connexes