Как аннотировать объект с суммой умножения двух полей из связанного объекта в реализованный объект в 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 общей ценой последнего заказа.

Взять, к примеру, такие данные:

an image of dummy data

Объекты 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

Вернуться на верх