Django查询。GroupCount订单由外键的外键?

问题描述 投票:1回答:2

我很难理解如何实现这个问题。我有3个相当简单的模型。

class Country(models.Model):
    name    = models.CharField(max_length=200, null=True, blank=True)
    def __str__(self):
        return self.name

class Seller(models.Model):
    name    = models.CharField(max_length=200, null=True, blank=True)
    country = models.ForeignKey(Country, null=True, blank=True, on_delete=models.SET_NULL)
    def __str__(self):
        return self.name

class Order(models.Model):
    order         = models.PositiveIntegerField(null=True, blank=True)
    seller        = models.ForeignKey(Seller, null=True, blank=True, on_delete=models.SET_NULL)
    order_date    = models.DateField(max_length=200, null=True, blank=True)
    def __str__(self):
        return self.name

"订单"是简单的产品订单,由"卖家"是我们供应的企业和"国家"定义了这些卖家在哪个国家。这可能是这样的情况:在这个国家我们有很多卖家,而在下一个国家我们只有一个卖家。

为了更好地理解我的问题,对订单进行了简化描述。

Order N° 1 by seller A from Germany
Order N° 2 by seller B from Germany
Order N° 3 by seller C from France
Order N° 4 by seller D from Spain
Order N° 5 by seller F from France

我想实现的是将该模型中存在的所有国家的订单进行分组。例如:(

Country  | Count of all orders by country
{Germany :      7 
Spain    :      12
France   :      5}

我已经尝试过这样的东西。

Order.objects.filter(customer__country__name__contains='Germany').annotate(count = Count('customer')).count()

有点效果,但我必须手动创建很多查询,因为有很多国家。有没有可能在所有国家中循环并提取这些信息?

python django django-models django-queryset
2个回答
3
投票

你可以简单地在这里使用group by(根据问题中的模型)。

from django.db.models import Count
Order.objects.values('seller__country__name').annotate(count=Count('seller')).values('seller__country__name','count') 

2
投票

你可以简单地包你的国家。像这样

for country in Country.objects.all():
    contains = {'customer__country__name__contains': country.name}
    Order.objects.filter(**contains).annotate(count = Count('customer')).count()
© www.soinside.com 2019 - 2024. All rights reserved.