Ist es möglich, ein Django-Abfrageset nach Modelleigenschaft zu filtern?
Ich habe eine Methode in meinem Modell:
@property
def myproperty(self):
[..]
und jetzt möchte ich nach dieser Eigenschaft filtern wie:
MyModel.objects.filter(myproperty=[..])
ist das irgendwie möglich
Antworten:
Nee. Django-Filter arbeiten auf Datenbankebene und generieren SQL. Um basierend auf Python-Eigenschaften zu filtern, müssen Sie das Objekt in Python laden, um die Eigenschaft auszuwerten - und zu diesem Zeitpunkt haben Sie bereits die gesamte Arbeit zum Laden erledigt.
quelle
Ich könnte Ihre ursprüngliche Frage falsch verstehen, aber in Python ist ein Filter eingebaut.
Es ist jedoch besser, ein Listenverständnis zu verwenden :
oder noch besser, ein Generatorausdruck :
quelle
Wenn Sie die von @ TheGrimmScientist vorgeschlagene Problemumgehung umgehen, können Sie diese "SQL-Eigenschaften" erstellen, indem Sie sie im Manager oder im QuerySet definieren und sie wiederverwenden / verketten / zusammenstellen:
Mit einem Manager:
Mit einem QuerySet:
Weitere Informationen finden Sie unter https://docs.djangoproject.com/de/1.9/topics/db/managers/ . Beachten Sie, dass ich die Dokumentation verlasse und die oben genannten nicht getestet habe.
quelle
Die Verwendung von F () mit Anmerkungen scheint meine Lösung dafür zu sein.
Es wird nicht nach gefiltert
@property
, daF
Gespräche mit der Datenbank geführt werden, bevor Objekte in Python gebracht werden. Aber immer noch hier als Antwort, da mein Grund für das Filtern nach Eigenschaften wirklich darin bestand, Objekte nach dem Ergebnis einfacher Arithmetik in zwei verschiedenen Feldern filtern zu wollen.Also etwas in der Art von:
anstatt die Eigenschaft zu definieren als:
Führen Sie dann ein Listenverständnis für alle Objekte durch.
quelle
BITTE korrigiert mich jemand, aber ich denke, ich habe eine Lösung gefunden, zumindest für meinen eigenen Fall.
Ich möchte an all jenen Elementen arbeiten, deren Eigenschaften genau gleich ... was auch immer sind.
Aber ich habe mehrere Modelle, und diese Routine sollte für alle Modelle funktionieren. Und es tut:
Mit dieser universellen Unterroutine kann ich alle Elemente auswählen, die genau meinem Wörterbuch der Kombinationen "Angeben" (Eigenschaftsname, Eigenschaftswert) entsprechen.
Der erste Parameter nimmt a (models.Model),
das zweite ein Wörterbuch wie: {"property1": "77", "property2": "12"}
Und es erstellt eine SQL-Anweisung wie
und gibt ein QuerySet für diese Elemente zurück.
Dies ist eine Testfunktion:
Und? Was denken Sie?
quelle
AttributeError: 'RawQuerySet' object has no attribute 'values'
Ich hatte das gleiche Problem und entwickelte diese einfache Lösung:
Ich weiß, dass es nicht die performativste Lösung ist, kann aber in einfachen Fällen wie meinen helfen
quelle
Ich weiß, dass es eine alte Frage ist, aber für diejenigen, die hier springen, halte ich es für nützlich, die folgende Frage und die relative Antwort zu lesen:
So passen Sie den Admin-Filter in Django 1.4 an
quelle
Es kann auch möglich sein queryset Anmerkungen zu verwenden , die die Eigenschaft get / set-Logik, wie vorgeschlagen zB durch doppelte @rattray und @thegrimmscientist , in Verbindung mit der
property
. Dies könnte zu etwas führen, das sowohl auf Python- als auch auf Datenbankebene funktioniert .Ich bin mir jedoch nicht sicher über die Nachteile: Ein Beispiel finden Sie in dieser SO-Frage .
quelle