Django: доступ к атрибутам модели - PullRequest
5 голосов
/ 24 апреля 2011

Извиняюсь за нубский вопрос, я совершенно новичок в Python и Django и пытаюсь сделать свое первое приложение.

У меня есть простой класс

class About(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    date = models.DateTimeField('date added')

, к которому я добавил одну запись.Я могу получить к нему доступ с помощью

about = About.objects.filter(id=1)

, однако, если я пытаюсь использовать синтаксис точки для доступа к его атрибутам, я получаю следующую ошибку

    >>> about.title
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'QuerySet' object has no attribute 'title'

Я знаю, как использовать Unicode в моделичтобы указать более подходящее возвращаемое значение, например

def __unicode__(self):
    return self.title

, следует ли мне использовать это для форматирования данных модели в словарь / список?Или мне просто не хватает поведения по умолчанию?

Ответы [ 4 ]

11 голосов
/ 24 апреля 2011

В вашем случае about является объектом QuerySet , а не экземпляром вашей модели.Попробуйте

print about[0].title

В качестве альтернативы используйте get (), чтобы получить один экземпляр модели :

about = About.objects.get(id=1)
print about.title
2 голосов
/ 24 апреля 2011

Фильтр возвращает QuerySet, а не единственный объект, который вы ищете.Используйте get вместо фильтра.

Методы, которые возвращают новые QuerySets

  • filter
  • ...

Методы, которые не возвращаютсяQuerySets

  • get
  • ...

http://docs.djangoproject.com/en/dev/ref/models/querysets/

1 голос
/ 24 апреля 2011

Если вы хотите получить только одну строку

about = About.objects.get(pk=1)

, теперь about является объектом (одна строка)

filter возвращает список, поэтому для доступа к элементам в списке вы должныиспользуйте index (около [0]) или for loop. но get вернуть ровно одну строку.

1 голос
/ 24 апреля 2011

Как объясняет документация , filter всегда возвращает QuerySet, представляющий собой список элементов в виде списка, даже если только один элемент соответствует условию фильтра.Таким образом, вы можете нарезать список для доступа к вашему элементу - about[0] - или, что лучше, использовать get() вместо:

about = About.objects.get(id=1)
print about.title
...