Bobsans
@Bobsans
Full-Stack Developer

Как можно описать такой запрос при помощи синтаксиса Django ORM?

Доброго времени суток.

Подскажите, пожалуйста, можно ли как-нибудь описать запрос к бд следующего типа при помощи Django ORM интаксиса?

SELECT *, (
    SELECT cp.value
    FROM calculated_price cp 
    WHERE cp.currency = 'USD' AND cp.item_id = it.id
    ) as converted
FROM items it
ORDER BY converted;


Заранее спасибо.
  • Вопрос задан
  • 69 просмотров
Решения вопроса 1
Bobsans
@Bobsans Автор вопроса
Full-Stack Developer
Решение подсказал Вадим Шаталов. Сылка: https://docs.djangoproject.com/en/dev/ref/models/e...
В моем случае вот что получилось:
class Item(models.Model):
    name = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=16, decimal_places=2)
    
class ConvertedPrice(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    currency = models.CharField(max_length=3)
    value = models.DecimalField(max_digits=16, decimal_places=2)

ordered_items = Item.objects.annotate(converted=Subquery(
    ConvertedPrice.objects.filter(item=OuterRef('id'), currency='USD').values('value')
)).order_by('converted')

И на выходе вот такой SQL:
SELECT 
    "app_item"."id", 
    "app_item"."name", 
    "app_item"."price", 
    (
        SELECT U0."value" 
        FROM "app_convertedprice" U0 
        WHERE (U0."currency" = USD AND U0."item_id" = ("app_item"."id"))
    ) AS "converted" 
FROM "app_item" 
ORDER BY "converted" ASC;
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Astrohas
@Astrohas
Python/Django Developer
Item.objects.filter(
     id__in=ConvertedPrice.objects.filter(currency='USD').values_list('item_id', flat=True)
).prefetch_related('convertedprice_set')
Ответ написан
Ваш ответ на вопрос

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

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