Django管理器 - 检索具有非空相关对象集的对象

3

我有两个类,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()

我想为投资组合编写一个“非空投资组合”管理器,这样我就可以执行以下操作:

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个回答

6
首先根据文档,您不能在filter/exclude子句中使用模型方法进行查找。此外,您也不能使用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)

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

Django >= 1.0的另一种方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接