【问题标题】:Left Outer Join on ModelCluster ParentalManyToManyField?ModelCluster ParentalManyToManyField 上的左外连接?
【发布时间】:2018-08-27 07:47:04
【问题描述】:

鉴于以下模型:

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)

我只是想获取一个类别列表,其中包含每个类别中的帖子数。

【问题讨论】:

    标签: python django-models left-join django-orm wagtail


    【解决方案1】:

    你可以这样做:

    from django.db.models import Count
    
    BlogCategory.objects.annotate(
        posts=Count('blogpost')
    )

    这将产生一个包含BlogCategorys 的QuerySet,其中每个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}]>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 2013-09-07
      • 2016-10-02
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      相关资源
      最近更新 更多