Сложные запросы в Django ORM

Задача сделать выборку списка продуктов из базы данных, цена которых находиться в некотором диапазоне, задаваемом пользователем. Сложность заключается в том, что в базе цены хранятся в различных валютах. Нет, хранить в одной валюте не подходит, т.к. курсы меняются, а пользователи из разных стран… И им удобнее оперировать со своей валютой. Итак. Поскольку кроме этого имеются еще куча фильтров для того же списка, то отказываемся от raw sql. Воспользуемся объектом Q (django.db.models.Q) из Django ORM. from django.db.models import Q

Product.objects.filter(
    Q(currency="EUR") & Q(price__gte=price_min_eur) |
    Q(currency="USD") & Q(price__gte=price_min_usd) |
    Q(currency="EUR") & Q(price__lte=price_max_eur) |
    Q(currency="USD") & Q(price__lte=price_max_usd))

В результате получаем:

SELECT *
FROM products
WHERE (currency="EUR" AND price>=%s) OR
      (currency="USD" AND price>=%s) OR
      (currency="EUR" AND price<=%s) OR
      (currency="USD" AND price<=%s)

 
comments powered by Disqus