используя django, как создать метод в модели для возврата данных запроса - PullRequest
2 голосов
/ 07 мая 2009

В следующем коде я пытаюсь создать метод show_pro, который будет отображать все аргументы для Case, которые являются профессиональными.

Я получаю эту ошибку:

>>> 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

вот код:

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

Ответы [ 2 ]

8 голосов
/ 07 мая 2009

Попробуйте:

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

По сути, вам нужно выполнить обратный поиск отношения ForeignKey, а затем отфильтровать его, чтобы получить связанные объекты Argument, имеющие side='p'.

В функции show_pro self не является QuerySet - оно относится к самому объекту.

1 голос
/ 07 мая 2009

Вы не можете вызвать self.objects, objects является членом класса, а не полем в экземпляре. Подумайте об этом таким образом, имеет ли смысл делать:

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

Не совсем. Вот что делает self.

Вместо этого вам нужно получить доступ к полям экземпляра. Как сказал Тайсон:

class Case(models.Model):
    ...
    def show_pro(self):
        return self.argument_set.filter(side='p')
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...