ModelCluster ParentalManyToManyField上的左外联接?

2024-04-24 13:42:48 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑到以下模型:

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)

我只是想得到一个类别列表,每个类别中有多少个帖子。你知道吗


Tags: namefromimportregisteridmodelspagesnippet
1条回答
网友
1楼 · 发布于 2024-04-24 13:42:48

您可以通过以下方式完成此操作:

from django.db.models import Count

BlogCategory.objects.annotate(
    posts=Count('blogpost')
)

这将导致一个QuerySet包含BlogCategory,其中每个BlogCategory都有一个额外的属性:posts,该属性包含类别的帖子数。你知道吗

或者如果你只对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}]>

相关问题 更多 >