Как получить значение из набора запросов в Django? - PullRequest
3 голосов
/ 23 мая 2019

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

Я пытался изменить метод модели __str__, чтобы он возвращал словарь, но он не работает или я делаю это неправильно.

class Settings(models.Model):
    bb_bonus_qualify = models.CharField(max_length=16, default=38.00)
    service_breakpoint = models.CharField(max_length=16, default=1700.00)

    def __str__(self):
        return '%s: %s, %s: %s' % (
            'bb_bonus', self.bb_bonus_qualify, 'service_breakpoint', self.service_breakpoint)

Я хотел бы сказать Settings.objects.last().values('bb_bonus') и получить значение, равное self.bb_bonus_qualify. Распространенная ошибка, которую я, похоже, получаю: AttributeError: 'Settings' object has no attribute 'values'

Ответы [ 2 ]

3 голосов
/ 23 мая 2019

Проблема в том, что ваш .last() будет извлекать последний Settings объект. Таким образом, вы вызовете .values('bb_bonus') для объекта Settings. Поскольку модель не имеет .values(..) метода, она ничего не вернет.

Однако вы можете извлечь значение определенного столбца из набора запросов с помощью:

Settings.objects<b>.values_list('bb_bonus_qualify', flat=True)</b>.last()

Здесь мы, таким образом, используем .values_list(..) [Django-doc] , это принимает имена столбцов в качестве параметров. Затем он обычно возвращает QuerySet списков с этими значениями. Но если вы укажете один столбец; затем, как сказано в документации:

Если вы передаете только одно поле, вы также можете передать параметр flat. Если True, это будет означать, что возвращаемые результаты представляют собой одиночные значения , а не однократные.

Таким образом, это означает, что мы создаем QuerySet единичных значений и затем извлекаем последнюю запись этого набора запросов. Обратите внимание, что мы не выбираем все элементы из набора запросов, .last() «внедряется» в запрос, который мы выполняем в базе данных, поэтому результатом является скалярное значение этого столбца для последней записи .

Таким образом, .values_list(..) необходимо выполнить до .last(), так как в противном случае вы говорите с Settings объектом, а не с QuerySet.

2 голосов
/ 23 мая 2019

AFAIK __str__ не имеет ничего общего с .values() - проблема здесь в том, что вам нужно указать значения до получения определенного элемента, а не наоборот:

Settings.objects.values('bb_bonus').last()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...