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

时间:2009-05-01 19:24:22

标签: 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()

我想为Portfolio编写一个“非空投资组合”经理,以便我可以这样做:

queryset = Portfolio.nonempty.all()

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

class NonEmptyManager(models.Manager):
    def get_query_set(self):
        return super(NonEmptyManager, self).get_query_set().filter(num_images > 0)

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

有什么想法吗?谢谢,

1 个答案:

答案 0 :(得分:6)

首先根据documentation,您无法使用模型方法进行filter / exclude子句的查找。那么你也不能使用> / filter的python运算符(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)

但是这个解决方案有一些限制。

Django的另一种方式> = 1.0:

def get_query_set(self):
    return super(NonEmptyManager,self).get_query_set()\
      .filter(images__isnull=True)