我正在使用带有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) 我有以下设置:
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的修饰符BUManager。BaseInfoQuerySet用作其他模型的多个查询集的基类,因此我不想摆脱它而仅使用models.Manager。而且我还希望能够链接QuerySet过滤器(例如BU.objects.public().not_grouped())。
我认为解决方案的方式是修改某种方法as_manager()以返回Manager使用重写get_queryset方法的修改。