Ответ 1
Вы можете использовать метод extra()
. Вот так:
Car.objects.all().extra(select = {'sales': 0})
Я хочу добавить статическое значение к результатам запроса базы данных с помощью 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
Вы можете использовать метод extra()
. Вот так:
Car.objects.all().extra(select = {'sales': 0})
Как и Django 1.8, annotate
функции Value
выражение:
cars= Car.objects.all().annotate(sales=Value(0, IntegerField()))
Вместо IntegerField
вы можете использовать все доступные классы полей db.
Я понимаю исходный вопрос: не использовать "сырой" 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', ()))
for car in Car.objects.all()
setattr(car, 'sales', 0)
это добавит каждому элементу в вашем запросе поле с именем sales with value 0. Это поле может использоваться только с этим экземпляром автомобиля.
ОБНОВЛЕНО