Новичок: изучение результатов Queryset - PullRequest
1 голос
/ 06 марта 2012

Отказ от ответственности: я новичок в Python и Django, но у меня есть опыт программирования на Drupal.

Я следую инструкциям здесь (http://www.djangobook.com/en/2.0/chapter05/),, но я смущен

Publisher.objects.filter(name='Apress')
[<Publisher: Apress>]

Я понимаю, что результатом является объект Queryset, так как я могу получить адрес (или первичный ключ), если следующий подход не работает?

p = Publisher.objects.filter(name='Apress')
a = p.address
'QuerySet' object has no attribute 'address'

Спасибо!

Ответы [ 3 ]

3 голосов
/ 06 марта 2012

Атрибуты доступны только для экземпляров модели. QuerySet - это просто список экземпляров модели, поэтому вам нужно как-то «распаковать» его, чтобы получить конкретный экземпляр и затем его атрибут.

Если вы знаете, что запрашиваете только одну вещь, вам следует использовать get вместо фильтра:

publisher = Publisher.objects.get(name='Apress')
print publisher.address

Но если будет возвращено несколько совпадений, возникнет исключение MultipleObjectsReturned, и, наоборот, если совпадений не будет найдено, возникнет исключение ObjectDoesNotExist. В результате вы должны быть осторожны при использовании get и обернуть свой код в соответствующие блоки try...except.

Если вы имеете дело с чем-то, где ожидаете более одного результата, то вы можете использовать некую структуру цикла для работы с каждым отдельным элементом в QuerySet:

for publisher in Publisher.objects.all():
    print publisher.address

Или вытащите один элемент, как в обычном списке:

first_publisher = Publisher.objects.all()[0]
print first_publisher.address
2 голосов
/ 06 марта 2012

Возможно, вам нужно вместо этого вызвать функцию get :

p = Subject.objects.get(name='Apress')
1 голос
/ 06 марта 2012

Ваш QuerySet - это, по сути, список, поэтому вам нужно перебрать каждый элемент, чтобы получить доступ к его атрибуту address. Как то так:

for p in Publisher.objects.filter(name='Apress'):
    # access p.address here

Ваш синтаксис сработает, если вы последуете совету @Thanasis выше, потому что использование get возвращает вам только один объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...