ModelCluster ParentalManyToManyField 上的左外连接?
Left Outer Join on ModelCluster ParentalManyToManyField?
给定以下模型:
from django.db import models
from wagtail.core.models import Page
from wagtail.snippets.models import register_snippet
from modelcluster.fields import ParentalManyToManyField
@register_snippet
class BlogCategory(models.Model):
name = models.CharField(max_length=255)
...
class BlogPost(Page):
author = models.CharField(max_length=255)
category = ParentalManyToManyField('blog.BlogCategory', blank=True)
...
使用 Django ORM
,我怎样才能获得与以下 SQL Join
:
相同的输出
SELECT bc.name, count(bp.id) posts
FROM BlogCategory bc LEFT JOIN BlogPost bp
ON bc.id=bp.category
GROUP BY bc.id;
name | posts
------+-------
cat3 | 0
cat2 | 2
cat1 | 1
(3 rows)
我只是想获取类别列表以及每个类别中的帖子数。
您可以使用:
from django.db.models import Count
BlogCategory.objects.annotate(
posts=Count('blogpost')
)
这将导致 QuerySet
包含 BlogCategory
s,其中每个 BlogCategory
都有一个额外的属性:posts
,其中包含 [=27] 的帖子数=]那个类别。
或者如果您只对 QuerySet
词典感兴趣:
from django.db.models import Count
BlogCategory.objects.values('id', 'name').annotate(
num_posts=Count('blogpost')
).order_by('id', 'name')
这将导致 QuerySet
如:
<QuerySet [{'id': 3, 'name': 'cat3', 'posts': 0},
{'id': 2, 'name': 'cat2', 'posts': 2},
{'id': 1, 'name': 'cat1', 'posts': 1}]>
给定以下模型:
from django.db import models
from wagtail.core.models import Page
from wagtail.snippets.models import register_snippet
from modelcluster.fields import ParentalManyToManyField
@register_snippet
class BlogCategory(models.Model):
name = models.CharField(max_length=255)
...
class BlogPost(Page):
author = models.CharField(max_length=255)
category = ParentalManyToManyField('blog.BlogCategory', blank=True)
...
使用 Django ORM
,我怎样才能获得与以下 SQL Join
:
SELECT bc.name, count(bp.id) posts
FROM BlogCategory bc LEFT JOIN BlogPost bp
ON bc.id=bp.category
GROUP BY bc.id;
name | posts
------+-------
cat3 | 0
cat2 | 2
cat1 | 1
(3 rows)
我只是想获取类别列表以及每个类别中的帖子数。
您可以使用:
from django.db.models import Count
BlogCategory.objects.annotate(
posts=Count('blogpost')
)
这将导致 QuerySet
包含 BlogCategory
s,其中每个 BlogCategory
都有一个额外的属性:posts
,其中包含 [=27] 的帖子数=]那个类别。
或者如果您只对 QuerySet
词典感兴趣:
from django.db.models import Count
BlogCategory.objects.values('id', 'name').annotate(
num_posts=Count('blogpost')
).order_by('id', 'name')
这将导致 QuerySet
如:
<QuerySet [{'id': 3, 'name': 'cat3', 'posts': 0},
{'id': 2, 'name': 'cat2', 'posts': 2},
{'id': 1, 'name': 'cat1', 'posts': 1}]>