Django 查询:按外键的外键对订单进行分组/计数?

Al *_*laj 4 python django django-models django-queryset

我很难思考如何实现这一目标。我有 3 个相当简单的模型:

\n\n
class Country(models.Model):\n    name    = models.CharField(max_length=200, null=True, blank=True)\n    def __str__(self):\n        return self.name\n\nclass Seller(models.Model):\n    name    = models.CharField(max_length=200, null=True, blank=True)\n    country = models.ForeignKey(Country, null=True, blank=True, on_delete=models.SET_NULL)\n    def __str__(self):\n        return self.name\n\nclass Order(models.Model):\n    order         = models.PositiveIntegerField(null=True, blank=True)\n    seller        = models.ForeignKey(Seller, null=True, blank=True, on_delete=models.SET_NULL)\n    order_date    = models.DateField(max_length=200, null=True, blank=True)\n    def __str__(self):\n        return self.name\n
Run Code Online (Sandbox Code Playgroud)\n\n

订单”是简单的产品订单,“卖家”是我们供货的企业,“国家”定义了这些卖家所在的国家/地区。可能的情况是,在一个国家/地区我们有很多卖家,而在下一个国家/地区我们只有 1 个。

\n\n

为了更好地理解我的问题,对命令的简化描述:

\n\n
Order N\xc2\xb0 1 by seller A from Germany\nOrder N\xc2\xb0 2 by seller B from Germany\nOrder N\xc2\xb0 3 by seller C from France\nOrder N\xc2\xb0 4 by seller D from Spain\nOrder N\xc2\xb0 5 by seller F from France\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
Country  | Count of all orders by country\n{Germany :      7 \nSpain    :      12\nFrance   :      5}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试过这样的事情:

\n\n
Order.objects.filter(customer__country__name__contains=\'Germany\').annotate(count = Count(\'customer\')).count()\n
Run Code Online (Sandbox Code Playgroud)\n\n

它有点有效,但我必须手动创建与国家/地区一样多的查询。是否有可能循环所有国家并提取此信息?

\n

rud*_*dra 6

您可以在此处简单地使用 group by (根据问题中的模型):

from django.db.models import Count
Order.objects.values('seller__country__name').annotate(count=Count('seller')).values('seller__country__name','count') 
Run Code Online (Sandbox Code Playgroud)