django - аннотация на основе полевых расчетов - PullRequest
2 голосов
/ 11 февраля 2011

Можно ли комментировать объекты с помощью вычислений (которые не являются тривиальной суммой \ max \ min \ count) на основе других полей?

Примеры:

  • Чтобы добавитьполе временной аннотации на основе существующего поля TimeField с добавлением определенного интервала времени
  • Чтобы добавить целочисленную аннотацию, которая представляет собой определенный расчет на основе двух полей IntegerFields

Обходной путь припо крайней мере, в некоторых случаях (например, в первом из двух примеров) будет команда update(), которая не сохраняется.Это позволило бы мне изменить определенное поле в QuerySet и использовать его локально, не изменяя записи в БД.Увы, AFAIK update() всегда сохраняет.

Конечно, решением было бы перечислить набор запросов и добавить поле, используя понимание списка, но я надеялся на более джангоистский способ сделать это.

1 Ответ

0 голосов
/ 13 марта 2017

Я только что сделал это (если я правильно понимаю), используя RawSQL-аннотацию :

queryset = City.objects.annotate(distance=
        RawSQL('sqrt(((%s - latitude)/0.010)^2 + ((%s - longitude)/0.015)^2)',
               (latitude, longitude))) \
    .filter(distance__lte=radius) \
    .order_by('distance')

Это комментирует города с чем-то похожим на их расстояние до точки (прямо через землю и с другими дурацкими предположениями, но это не относится к этому вопросу).

Часто вы можете просто реализовать свойство в своем классе модели в тех случаях, когда вам не нужна аннотация (здесь distance) для фильтрации в том же запросе.

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