Django ORM: Get neuesten Stand Objekt, das eine bestimmte Bedingung erfüllt
-
19-08-2019 - |
Frage
Da ein Objekt wie:
class M(models.Model):
test = models.BooleanField()
created_date = models.DateTimeField(auto_now_add=True)
Da Beispieldaten (unter der Annahme monoton steigende automatische created_date):
M(test=False).save()
M(test=True).save()
M(test=False).save()
X = M(test=True).save()
M(test=False).save()
Y = M(test=False).save()
M(test=False).save()
M(test=True).save()
Kann man die Django ORM verwenden, um eine Abfrage zu erstellen, die X zurückkehren würde (die vorherige Abfrage, nach Datum, wo ‚test‘ = True), wenn Sie Y gegeben sind? Wenn ja, wie?
Mit anderen Worten: Da Y, wie man das jüngste vorherige Element ist, wo ‚test‘ True ist
Gedanken & Feedback ist willkommen, danke!
Lösung
Versuchen Sie, diese
M.objects.filter(created_date__lte=Y.created_date).filter(test=True)[0:1]
Sie können auch eine order_by Klausel wie
hinzufügenM.objects.filter(created_date__lte=Y.created_date)\
.filter(test=True)\
.order_by('-created_date')[0:1]
Das sollte funktionieren.
Andere Tipps
Mit Hilfe von Django Feld Lookups , Sie können etwas zum Effekt von der Lage sein, zu erreichen, was Sie mit dem folgenden Ausdruck werden sollen:
M.objects.filter( test=True, created_date__lt=Y.created_date ).order_by( '-created_date' )
Je nachdem, ob es oder nicht alle Elemente in dem resultierenden queryset Objekt, können Sie die ersten ein abholen kann, die das jüngste Objekt sein wird, die Sie wollen.