Можно ли в 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". Я не знаю, будет ли это лучшим способом.