Django статическая аннотация - PullRequest
23 голосов
/ 28 августа 2010

Я хочу добавить статическое значение к результатам запроса к базе данных, используя django (поэтому не использую «сырой» 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

- Триндаз на Феданге # Джанго

Ответы [ 4 ]

57 голосов
/ 19 апреля 2016

Начиная с Django 1.8, annotate функции Value выражение :

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

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

9 голосов
/ 28 августа 2010

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

Car.objects.all().extra(select = {'sales': 0})
2 голосов
/ 21 ноября 2015

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

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

Это старый API, который мы стремимся исключить в некоторыхточка в будущем.

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

from django.db.models.expressions import RawSQL
Car.objects.all().annotate(sales=RawSQL('SELECT 0', ()))
0 голосов
/ 28 августа 2010
for car in Car.objects.all()
    setattr(car, 'sales', 0)

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

ОБНОВЛЕНО

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