У меня есть две похожие модели -
class Auction(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid4, editable=False)
# other properties
и
class MaxBid(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid4, editable=False)
value = models.DecimalField(
decimal_places=2,
max_digits=10,
validators=[MinValueValidator(MINIMUM_TRANSACTION_VALUE)]
)
created = models.DateTimeField(default=timezone.now)
auction = models.ForeignKey(
'Auction',
on_delete=models.CASCADE,
related_name='bids'
)
user = models.ForeignKey(
get_user_model(),
on_delete=models.CASCADE,
related_name="bids"
)
Я хочу получить максимальную ставку, которую пользователь сделал на аукционе, и столбцы аукциона в SINGLE django SQL запрос.
Этот вопрос SO - SQL выбор только строк с максимальным значением в столбце - помог мне увидеть способ делая это в необработанном виде sql -
SELECT * FROM "products_maxbid" as m
JOIN "products_auction" as a on m.auction_id = a.uuid
WHERE m.uuid in (
SELECT m.uuid FROM "products_maxbid" as m
INNER JOIN (
SELECT auction_id, Max(value) as value FROM "products_maxbid"
WHERE user_id = '2'
GROUP BY auction_id
) n
on m.auction_id = n.auction_id and m.value = n.value and m.user_id = '2'
)
ORDER BY a.square_id # can apply any orders now to the auction table like normal
Я не знаю, с чего начать достигать этого в Django - ну, конечно, документы, но там ничего не выделяется.
Все, что я разработал, это подзапрос внутри INNER JOIN -
bids = MaxBid.objects.filter(user=some_user).values("auction").annotate(max=Max('value')).order_by()
Когда я пытаюсь использовать это с filter
, он жалуется, что в одном запросе возвращены два столбца. Итак, я думаю, первый вопрос - как мне сделать INNER JOIN так, как это делает raw SQL?
Возможно ли это через ORM? Этот ответ вселяет в меня надежду, но я не могу обернуть голову вокруг него - Django: запись с максимальным элементом
Обновление -
Я не осознавал, насколько просты необработанные SQL запросы, поэтому будут только они