Python django left join+按计数分组(*),包括零计数
我想显示所有项目组,并为每个组显示该组的项目数,包括没有项目的组 在SQL中,我使用左连接来实现此目的:Python django left join+按计数分组(*),包括零计数,python,django,django-models,django-orm,Python,Django,Django Models,Django Orm,我想显示所有项目组,并为每个组显示该组的项目数,包括没有项目的组 在SQL中,我使用左连接来实现此目的: class ItemGroup(models.Model): name = models.CharField(max_length=50) class Item(models.Model): name = models.CharField(max_length=50) group = models.ForeignKey(ItemGroup, on_delete=model
class ItemGroup(models.Model):
name = models.CharField(max_length=50)
class Item(models.Model):
name = models.CharField(max_length=50)
group = models.ForeignKey(ItemGroup, on_delete=models.CASCADE)
所以我也得到了零计数的组
如何使用django ORM执行等效查询?您需要使用django注释。将外键稍微修改为:
SELECT item_group.name, COUNT(*) as item_count
FROM item_group
LEFT JOIN item ON item_group.id = item.id
GROUP BY item_group.id, item_group.name
为了方便命名
然后运行python manage.py makemigration,然后运行
python manage.py迁移
然后是注释的时候了
group = models.ForeignKey(ItemGroup, related_name='items', on_delete=models.CASCADE)
这样做的目的是向每个ItemGroup对象添加一个名为no_of_items的属性,该属性是和它相关的项的计数
现在,如果您执行item_group=ItemGroup.objects.getid=1,假设item group 1有3个相关项,那么您可以执行item_group.no_of_items,这将为您提供3个。如果另一个ItemGroup有0个项目,它将返回零
有关注释的详细信息,请参见
from django.db.models import Count
ItemGroup.objects.annotate(no_of_items=Count('items'))