Как отфильтровать набор запросов с расчетом? - PullRequest
0 голосов
/ 19 мая 2018

У меня есть модель, похожая на

class House:
    x = IntegerField()
    y = IntegerField()

Я хочу вернуть дома, которые находятся на меньшем расстоянии, чем расстояние , из некоторого положения, используя следующий расчет:

abs(house.x - myPos.x) + abs(house.y - myPos.y) < distance

Но я не знаю, как сделать этот фильтр, так как filter () сравнивается только с полем модели.Я хотел бы сделать что-то вроде:

House.objects.filter(abs(x - myPos.x) + abs(y - myPos.y) < distance)

1 Ответ

0 голосов
/ 19 мая 2018

Решение этой проблемы может быть решено в 2 этапа:

  1. Аннотировать abs(x - myPos.x) + abs(y - myPos.y) выражение
  2. Сравнить аннотированное выражение со значением distance

Для аннотирования выражения Django ORM поддерживает функциональные выражения , которые предоставляют функции базы данных, такие как COALESCE , LOWER , SUM , ABS и многие другие.

Для вашего примера вы можете использовать этот запрос:

from django.db.models import Func, F
House.objects.annotate(abs_calculation=Func(F('x') - myPos.x, function='ABS') + Func(F('y') - myPos.y, function='ABS')).filter(abs_calculation__lt=distance)
...