Django managers - retrieving objects with a non-empty set of related objects

I have two classes: portfolio and portfolio.

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

class Portfolio(models.Model):
    def num_images(self):
        return self.images.count()

I want to write a non-empty portfolio manager for Portfolio so that I can:

queryset = Portfolio.nonempty.all()

I tried to do something similar, but I don't think this is even close:

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

I don’t know where to start, and I find documentation that is a little lacking in this area.

Any ideas? Thanks,

+3
source share
1 answer

, , 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)
+6

Source: https://habr.com/ru/post/1707497/


All Articles