Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django left join+按计数分组(*),包括零计数_Python_Django_Django Models_Django Orm - Fatal编程技术网

Python django left join+按计数分组(*),包括零计数

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

我想显示所有项目组,并为每个组显示该组的项目数,包括没有项目的组

在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=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'))