我有两个类,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)
我真的不知道从哪里开始,我发现这方面的文档有点缺乏。
有什么想法吗?谢谢,
答案 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)