Django Managers - Получение объектов с непустым набором связанных объектов - PullRequest
3 голосов
/ 01 мая 2009

У меня есть два класса, 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 голосов
/ 02 мая 2009

Прежде всего, согласно документации , вы не можете использовать методы модели для поиска с предложением 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)

Но это решение имеет некоторые ограничения.

Другой способ для Джанго> = 1.0:

def get_query_set(self):
    return super(NonEmptyManager,self).get_query_set()\
      .filter(images__isnull=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...