【问题标题】:How to properly use Django ORM Count with shopping cart如何在购物车中正确使用 Django ORM Count
【发布时间】:2021-04-24 09:42:20
【问题描述】:

我有这样的模型结构,我需要获取有关订购了多少比萨饼的信息。 我做了这样的事情PizzaOrder.objects.all().values('pizza').annotate(total=Count('pizza'))。它适用于PizzaOrder 中的count 等于1 的订单,但如果count 大于1,则显示错误的计数。所以我想以某种方式将 Django Count 与我的字段 count 连接起来,以便知道订购了多少比萨饼。

models.py

class Pizza(models.Model):
    name = models.CharField(max_length=256)


class Order(models.Model):
    order_number = models.IntegerField(primary_key=True)
    pizzas = models.ManyToManyField(to='Pizza', through='PizzaOrder')


class PizzaOrder(models.Model):
    pizza = models.ForeignKey(
        to=Pizza,
        on_delete=models.PROTECT,
    )
    order = models.ForeignKey(
        to=Order,
        on_delete=models.PROTECT,
    )
    count = models.SmallIntegerField()

【问题讨论】:

  • 您想知道为Order 的实例订购了多少比萨饼,还是只查找与Order 无关的总数?或者也许是关于一些单独的比萨饼?
  • @AbdulAzizBarkat,总数不考虑Order

标签: python django django-models django-orm


【解决方案1】:

你需要使用Sum函数而不是Count

# annotating on the orders:
orders = Order.objects.annotate(total=Sum('pizzaorder__count'))

for order in orders:
    print(order.order_number, order.total)


# annotating on the pizzas:
pizzas = Pizza.objects.annotate(total=Sum('pizzaorder__count'))

for pizza in pizzas:
    print(pizza.name, pizza.total)


# aggregating irrespective of order / pizza:
pizza_count = PizzaOrder.objects.aggregate(total=Sum('count'))['total']

print(pizza_count)

【讨论】:

  • 感谢您的回答,这不是我想要的,但在您的回答的帮助下,我得到了预期的结果pizza_count = PizzaOrder.objects.values('pizza').annotate(total=Sum('count'))
  • @truefan4ever pizzas = Pizza.objects.annotate(total=Sum('pizzaorder__count')) 也会这样做,事实上,从那时起你现在还拥有比萨饼名称以及 Pizza 模型上存在的所有其他字段会更好,如果你使用 group,你将丢失这些字段由。
猜你喜欢
  • 1970-01-01
  • 2020-08-05
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2021-12-18
  • 2017-02-18
  • 1970-01-01
相关资源
最近更新 更多