Подтвердить что ты не робот

Статическая аннотация django

Я хочу добавить статическое значение к результатам запроса базы данных с помощью django (поэтому не используя 'raw' SQL)

Например, если у меня есть объект Car с поля make, model и color, то я хочу, чтобы мои результаты были установлены с дополнительным статическим значением, чтобы выглядеть примерно так:

make     model     color    sales
----     -----     -----    -----
nissan   bluebird  black    0
ford     fiesta    red      0
toyota   camry     green    0

Я пробовал код вроде

cars= Car.objects.all().annotate(sales=0)

но получили ошибки. Что я могу сделать?

Cheers, Dave

- Триндаз в Fedang #django

4b9b3361

Ответ 1

Вы можете использовать метод extra(). Вот так:

Car.objects.all().extra(select = {'sales': 0})

Ответ 2

Как и Django 1.8, annotate функции Value выражение:

cars= Car.objects.all().annotate(sales=Value(0, IntegerField()))

Вместо IntegerField вы можете использовать все доступные классы полей db.

Ответ 3

Я понимаю исходный вопрос: не использовать "сырой" SQL, но с Django 1.8 использование extra() не рекомендуется. Из docs:

Использовать этот метод в качестве последнего средства

Это старый API, который мы стремимся осуждать в какой-то момент в будущее.

Для других, пытающихся сделать то же самое и желая использовать небольшой кусок необработанного SQL, рабочая альтернатива, все еще использующая API Django с annotate() и RawSQL:

from django.db.models.expressions import RawSQL
Car.objects.all().annotate(sales=RawSQL('SELECT 0', ()))

Ответ 4

for car in Car.objects.all()
    setattr(car, 'sales', 0)

это добавит каждому элементу в вашем запросе поле с именем sales with value 0. Это поле может использоваться только с этим экземпляром автомобиля.

ОБНОВЛЕНО