Django Managers - 检索具有非空相关对象集的对象

Dom*_*ger 3 django orm

我有两个类,Portfolio和PortfolioImage.

class PortfolioImage(models.Model):
    portfolio     = models.ForeignKey('Portfolio', related_name='images')
    ...

class Portfolio(models.Model):
    def num_images(self):
        return self.images.count()
Run Code Online (Sandbox Code Playgroud)

我想为Portfolio编写一个"非空投资组合"经理,这样我就能做到:

queryset = Portfolio.nonempty.all()
Run Code Online (Sandbox Code Playgroud)

我尝试过这样的事情,但我认为这甚至不是很接近:

class NonEmptyManager(models.Manager):
    def get_query_set(self):
        return super(NonEmptyManager, self).get_query_set().filter(num_images > 0)
Run Code Online (Sandbox Code Playgroud)

我真的不知道从哪里开始,我发现这方面的文档有点缺乏.

有任何想法吗?谢谢,

Ale*_*lev 6

首先根据文档,您不能使用模型方法来查找filter/ excludeclause.然后,你也不能使用Python运营商(>在你的情况下)filter/ exclude.

如果您使用Django 1.1beta解决您的任务:

from django.db.models import Count

#...

def get_query_set(self):
    return super(NonEmptyManager,self).get_query_set()\
      .annotate(num_images=Count('images'))\
      .filter(num_images__gt=0)
Run Code Online (Sandbox Code Playgroud)

但这种解决方案有一些局限性.

Django> = 1.0的另一种方式:

def get_query_set(self):
    return super(NonEmptyManager,self).get_query_set()\
      .filter(images__isnull=True)
Run Code Online (Sandbox Code Playgroud)