Можно ли в django orm annotate добавить подзапрос с другими отношениями

У меня есть представление для отображения общего запаса по "торговым точкам".

Моя проблема заключается в том, что добавлена новая таблица, и я поместил еще одно поле в моем представлении (подсчет общего количества зарезервированных продуктов).

Мой текущий сценарий:

Таблицы

class SalePoint(models.Model):
    location = models.CharField(max_length=200, verbose_name='Local')
    [...]
class Box(models.Model):
    sale_point = models.ForeignKey(
        [...]
        related_name='boxes',
        [...]
    )
    product = models.ForeignKey(
        [...]
        related_name='boxes',
        [...]
    )
    amount = models.PositiveSmallIntegerField()
    capacity = models.PositiveSmallIntegerField()
class Product(models.Model):
    name = models.CharField()
    sku = models.CharField()

View

SalePointStockViewSet(viewsets.ModelViewSet):
    def list(self, request):
        queryset = (
            SalePoint.objects.values(
                'location',
                'boxes__product__name'
            ).annotate(
                total_amount=Sum('boxes__amount'),
                total_capacity=Sum('boxes__capacity'),
            )
            .order_by('location', 'total_amount')
        )
        return Response(queryset)

Как я уже говорил, мое представление работает нормально. Мне нужно включить новое поле "reserved" в мой набор запросов.

Reserved - это сумма всех заказанных продуктов со статусом "ожидание" из этой таблицы:

class Order(models.Model):
    WAITING = 'WAIT'
    DELIVERED = 'DELI'
    STATUS_CHOICES = [
        (WAITING, 'Waiting'),
        (DELIVERED, 'Delivered'),
    ]
    sale_point = models.ForeignKey(
        [...]
        related_name='orders',
        [...]
    )
    product_sku = models.CharField()
    status = models.CharField(
        [...]
        choices=STATUS_CHOICES,
    )

О чем я думаю

Я думаю, возможно ли добавить поле "reserved" и заполнить его "подзапросом". Проблема в том, что мне нужно отфильтровать товар по "sku". Я не знаю, будет ли это лучшим способом.

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