小编Fla*_*ing的帖子

带有注释的Django queryset,为什么GROUP BY应用于所有字段?

我正在使用带有PostgreSQL的Django 1.6,并有以下型号:

# models.py
class Game(AbstractContentModel, AbstractScoreModel):
    name = models.CharField(_("name"), max_length=100, blank=True)
    developer = models.CharField(_('Developer'), max_length=255)
    distributor = models.CharField(_('Distributor'), max_length=255, blank=True)
    # ...
    reviews = models.ManyToManyField(Review, related_name="games", blank=True, verbose_name=_("Reviews"))
    videos = models.ManyToManyField(Video, related_name="games", blank=True, verbose_name=_("Videos"))
    images = models.ManyToManyField(Image, related_name="games", blank=True, verbose_name=_("Gallery"))
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取所有游戏,并且每个游戏都会添加相关视频,评论和图像,如下所示:

# views.py
qs = Game.objects.all()
qs = qs.annotate(video_count=models.Count('videos'))
qs = qs.annotate(review_count=models.Count('reviews'))
qs = qs.annotate(image_count=models.Count('images'))
Run Code Online (Sandbox Code Playgroud)

结果查询是:

SELECT 
"content_game"."id", 
"content_game"."name",
"content_game"."developer", 
"content_game"."distributor",
COUNT("content_game_videos"."video_id") AS "video_count",
COUNT("content_game_reviews"."review_id") AS "review_count", 
COUNT("content_game_images"."image_id") AS "image_count" 
FROM "content_game" 
LEFT OUTER JOIN "content_game_videos" ON ( "content_game"."id" …
Run Code Online (Sandbox Code Playgroud)

python sql django postgresql orm

8
推荐指数
1
解决办法
683
查看次数

如果由QuerySet.as_manager()创建,则修改Django Manager get_queryset()方法。

我有以下设置:

from django.db import models

class BaseInfoQuerySet(models.query.QuerySet):

    def public(self):
        return self.filter(public=True)

    def not_grouped(self):
        return self.filter(bu_group=True)


class BUManager(models.Manager):

    def get_queryset(self):
        return BaseInfoQuerySet(self.model, using=self._db).extra(
            select={'null_group': 'bu_group_id IS NULL'},
            order_by=['null_group'])


class BU(models.Model):
    # some field definitions

    # option 1 (preferred)
    objects = BaseInfoQuerySet.as_manager()
    # option 2
    objects = BUManager()
Run Code Online (Sandbox Code Playgroud)

我正在使用Django 1.8和Python 2.7。

我要实现的是能够使用,# option 1但其中的所有方法BaseInfoQuerySet都应使用get_queryset()from的修饰符BUManagerBaseInfoQuerySet用作其他模型的多个查询集的基类,因此我不想摆脱它而仅使用models.Manager。而且我还希望能够链接QuerySet过滤器(例如BU.objects.public().not_grouped())。

我认为解决方案的方式是修改某种方法as_manager()以返回Manager使用重写get_queryset方法的修改。

python django

5
推荐指数
1
解决办法
834
查看次数

标签 统计

django ×2

python ×2

orm ×1

postgresql ×1

sql ×1