Django annotate count of disctinct values of the running quesyset in its children
Я отслеживал эту ошибку некоторое время, пока не нашел источник, из которого, как я полагаю, она исходит, и теперь я застрял здесь. У меня есть следующие модели:
class ShopItem(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
store = models.ForeignKey(to=Store, on_delete=models.CASCADE)
name = models.CharField(max_length=250)
class SelectedProduct(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name="products", null=True, blank=True)
product = models.ForeignKey(ShopItem, null=True, blank=True, on_delete=models.SET_NULL)
class Order(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
store = models.ForeignKey(Store, on_delete=models.CASCADE, related_name="orders")
status = models.PositiveIntegerField(choices=OrderStatus.choices, default=OrderStatus.CART)
number = models.CharField(max_length=36, blank=True, null=True)
Допустим, например, в заказе 5 товаров, 3 из них одного типа (p1, p2, p3), так как они ссылаются на один и тот же товар; где два других товара (p4, p5) отличаются, так как они ссылаются на разные товары магазина.
Я пытаюсь определить, сколько одинаковых продуктов существует в этом заказе, как в следующем
products = order.products.all().annotate(quantity=Count("product"))
Попытка получить набор этих продуктов с аннотацией количества, единственное, я получаю количество 1 для всех продуктов, где я пытаюсь получить:
p1.quanity
> 3
p2.quanity
> 3
p3.quanity
> 3
p4.quanity
> 1
p5.quanity
> 1
могу ли я добиться этого? Я ценю любые идеи!
Вы должны аннотировать ShopItems, так:
products = ShopItem.objects.filter(
selectedproduct__order=order
).annotate(
quantity=Count('selectedproduct')
)
В результате получится QuerySet из ShopItems, которые упорядочены хотя бы один раз, и с quantity количеством SelectedProducts для этого order и этого ShopItem.