Как аннотировать объект с суммой умножения двух полей из связанного объекта в реализованный объект в Django
Учитывая эти три класса
class User(BaseModel):
name = models.CharField(..)
class Order(BaseModel):
user = models.ForeignKey(User,...,related_name='orders')
class OrderItem(BaseModel):
order = models.ForeignKey(Order,...,related_name='items'
quatity = models.IntegerField(default=1)
price = models.FloatField()
и это базовый класс (достаточно отметить, что он имеет поле created_at)
class BaseModel(models.Model):
createt_at = models.DateTimeField(auto_now_add=True)
Теперь у каждого пользователя будет несколько заказов, а у каждого заказа несколько OrdeItems
Я хочу аннотировать объекты User общей ценой последнего заказа.
Взять, к примеру, такие данные:
Объекты User должны быть аннотированы суммой последнего заказа, то есть для пользователя john с id=1. мы должны вернуть сумму order_items (с id=3 & 4), поскольку они относятся к заказу id=2, так как это самый последний заказ.
Надеюсь, я понятно изложил свою мысль. Я новичок в Django и пытался изучить документацию и пробовал много разных вещей, но я продолжаю застревать на получении последних позиций заказа
Иногда непонятно, как сделать такой запрос в Django ORM. В вашем случае я бы написал запрос на сыром SQL примерно так:
WITH last_order_for_user AS (
SELECT id, user_id, MAX(created_at)
FROM orders
GROUP BY user_id
) -- last order_id for each user_id
SELECT
order.user_id, order.id, SUM(item.price)
FROM
last_order_for_user order
LEFT JOIN
orderitems item ON order.id=item.order_id
GROUP BY 1,2 -- sum of items for last order, user
А затем выполнить необработанный SQL django-docs
