Как отфильтровать обьекты в таблиц по полю Цена, валюта разная, но цена должна быть больше 50 долларов?

Есть таблица с обьектами. У каждого обьекта есть поле цена и валюта. Примерно так:
1 Машина 40 Евро
2 Дом 100 Фунтов

Как отфильтровать обьекты которые дороже 50 долларов, учитывая курс Евро/Доллар или Другая Валюта/Доллар?
  • Вопрос задан
  • 357 просмотров
Решения вопроса 1
@deliro
Таблица с курсами с эталонным долларом (все курсы - отношение валюты к доллару).
| ID      | WALLET   | VALUE  |
| 1       | EUR      | 1.1192 |
| 2       | RUR      | 0.0151 |


Табличку, скорее всего, лучше держать в кэше. А дальше задача тривиальная.
condition = None
price = 50  # так же?
for course in Course.objects.all():
    if condition is None:
        condition = Q(wallet=course.wallet) & Q(price__gt=price/course.value)
    else:
        condition |= Q(wallet=course.wallet) & Q(price__gt=price/course.value)
return Product.objects.filter(condition)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@vista1x
1) Должна быть табличка с валютами со следующими полями: Ид, название, курс (по отношению к базовой валюте - доллар, например)
2) Делаете запрос, в котором переводите все валюты в одну (доллар) и делаете условие по этому полю
Ответ написан
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
делаете таблицу с курсами, далее джойн Вашей таблицы с таблицей с курсами - и уже по этому джойну делайте выборку. Сразу хочу отметить - работать это будет ОЧЕНЬ не быстро. И индексы тут не факт что спасут. Если предполагается эту выборку делать несколько раз в день - я бы очень советовал делать предрасчитанную таблицу с приведенной к доллару ценой (или обновлять поле в основной таблице). Так 1 раз потратите время на расчет - дальнейшие выборки будут быстрыми, тут уже индекс сработает точно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы