3 Stimmen

Django Managers - Abrufen von Objekten mit einer nicht leeren Menge von verwandten Objekten

Ich habe zwei Klassen, Portfolio und PortfolioImage.

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

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

Ich möchte einen "nicht-leeren Portfolio"-Manager für Portfolio schreiben, so dass ich tun kann:

queryset = Portfolio.nonempty.all()

Ich habe versucht, etwas Ähnliches zu machen, aber ich glaube nicht, dass das auch nur annähernd funktioniert:

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

Ich weiß nicht wirklich, wo ich anfangen soll, und ich finde die Dokumentation in diesem Bereich etwas dürftig.

Irgendwelche Ideen? Danke!

6voto

Alex Koshelev Punkte 15739

In erster Linie nach Dokumentation können Sie keine Modellmethoden für Lookup mit filter / exclude Klausel. Dann können Sie auch keine Python-Operatoren verwenden ( > in Ihrem Fall) mit filter / exclude .

Um Ihre Aufgabe zu lösen, wenn Sie Django 1.1beta verwenden:

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)

Diese Lösung hat jedoch einige Einschränkungen.

Ein anderer Weg für Django >= 1.0:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X