Django ORM для получения аннотированной суммы записей о связанных моделях. (пытаясь использовать подзапрос напрасно.) - PullRequest
0 голосов
/ 03 ноября 2019

В настоящее время я создаю веб-сайт для электронной коммерции на основе изображений.
Изображения помечены некоторыми продуктами, и мне нужно получать общий доход от продажи продуктов, помеченных на каждом изображении.

"""
models.py
"""

class Image(AbstractImageModel):
    """
    Images are linked to Product model via intermediary ProductInImage table.
    """
    ...
    products = models.ManyToManyField(
        "catalogue.Product", through="ProductInImage", related_name="listed_images"
    )
    ...


class ProductInImage(TimeStampedModel):
    """
    Intermediary model that connects Image with Products
    """
    image = models.ForeignKey("images.Image", models.CASCADE)
    product = models.ForeignKey("catalogue.Product", models.CASCADE)


class OrderLine(models.Model):
    """
    An order line
    """
    order = models.ForeignKey(
        'order.Order',
        on_delete=models.CASCADE,
        related_name='lines',
        verbose_name=_("Order"))
    ...
    product = models.ForeignKey(
        'catalogue.Product', on_delete=models.SET_NULL, blank=True, null=True,
        verbose_name=_("Product"))
    quantity = models.PositiveIntegerField(_("Quantity"), default=1)
    ...
    line_price = models.DecimalField(_("Line Price"), decimal_places=2, max_digits=12)

Я пытаюсь получить набор запросов Image.objects, аннотированный общим доходом от всех продуктов, помеченных на каждом изображении.

Я делал что-то похожее на следующие строки, но, похоже, не могуприступить к работе.

# to use in subquery
line_qs = OrderLine.objects  \
          .filter(product__id__in=OuterRef("product_pk"))  \
          .values("line_price")  \
          .annotate(revenue=Sum("line_price"))

# queryset that I need: must be annotated with revenue made from all products, for each image
qs = Image.objects.all()
qs = qs.annotate(revenue=Subquery(line_qs.values("revenue")))

Большое спасибо заранее;Я очень ценю вашу помощь.

...