2009-05-01 120 views
3

我有两个类,Portfolio和PortfolioImage。Django经理 - 检索与非空集相关对象的对象

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) 

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

任何想法?谢谢,

回答

6

首先根据documentation您不能使用模型方法与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)