Ошибка отладки Django - PullRequest
       7

Ошибка отладки Django

0 голосов
/ 25 марта 2010

В моей модели есть следующее:

 class info(models.Model):
     add = models.CharField(max_length=255)
     name = models.CharField(max_length=255)

В представлениях, когда я говорю info_l = info.objects.filter (id = 1) logging.debug (info_l.name)

я получаю сообщение об ошибке, говорящее, что имя не существует в операторе отладки Объект QuerySet не имеет атрибута name 1. Как это можно решить. 2. Также, как запросить только одно поле вместо выбора всех, как выберите имя из информации.

1 Ответ

2 голосов
/ 25 марта 2010

1. Выбор отдельных элементов

Похоже, вы пытаетесь получить один объект. Использование filter вернет объект QuerySet (как это происходит в вашем коде), который ведет себя больше как список (и, как вы заметили, отсутствует атрибут name).

У вас есть два варианта здесь. Во-первых, вы можете просто взять первый элемент:

info_l = info.objects.filter(id=1)[0]

Вместо этого вы также можете использовать метод objects.get, который вернет один объект (и вызовет исключение, если он не существует):

info_l = info.objects.get(id=1)

Django имеет довольно хорошую документацию по QuerySets, и, возможно, стоит взглянуть на нее:
Документы по использованию фильтров
QuerySet ссылка

2. Получение определенных полей

Django предоставляет методы defer и only, которые позволят вам выбирать конкретные поля из базы данных, а не извлекать все сразу. Это на самом деле не мешает чтению полей; скорее это загружает их лениво. defer - это режим «opt-in», который позволяет вам указать, какие поля следует загружать лениво. only is out-out - вы называете это, и только поля, которые вы передаете, будут загружены с нетерпением.

Итак, в вашем примере вы хотели бы сделать что-то вроде этого:

info_l = info.objects.filter(id=1).only('name')[0]

Хотя с такой простой моделью, как в приведенном вами примере, я бы не стал сильно беспокоиться об ограничении полей.

...