Ich habe ein Feld in einem Modell wie:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
Jetzt muss ich die Objekte nach einem Datumsbereich filtern.
Wie filtere ich alle Objekte, deren Datum zwischen 1-Jan-2011
und liegt 31-Jan-2011
?
python
django
django-models
django-queryset
user469652
quelle
quelle
__range
die Ränder (wie SQLsBETWEEN
) enthalten, wenn Sie nicht möchten, dass die Ränder enthalten sind, müssten Sie mit meiner gt / lt-Lösung gehen ...order_by
die erzeugte überQuerySet
durch die oben genanntenfilter
. Ich habe Django seit Jahren nicht mehr benutzt.Sie können Djangos
filter
mitdatetime.date
Objekten verwenden :quelle
Wenn Sie Django-Bereiche mit einem Filter ausführen, stellen Sie sicher, dass Sie den Unterschied zwischen der Verwendung eines Datumsobjekts und einem Datum / Uhrzeit-Objekt kennen. __range ist an Datumsangaben inklusive. Wenn Sie jedoch ein Datums- / Uhrzeitobjekt für das Enddatum verwenden, werden die Einträge für diesen Tag nicht berücksichtigt, wenn die Uhrzeit nicht festgelegt ist.
Gibt alle Einträge vom Startdatum bis zum Enddatum zurück, einschließlich der Einträge an diesen Daten. Schlechtes Beispiel, da dies Einträge eine Woche in der Zukunft zurückgibt, aber Sie bekommen die Drift.
Abhängig von der Uhrzeit für die Datumsfelder fehlen Einträge im Wert von 24 Stunden.
quelle
date
Objekt importiert :>>> from datetime import date
>>> startdate = date.today()
Sie können die "Impedanzfehlanpassung" umgehen , die durch die mangelnde Genauigkeit des
DateTimeField/date
Objektvergleichs verursacht wird - die bei Verwendung des Bereichs auftreten kann -, indem Sie mit datetime.timedelta einen Tag zum letzten Datum im Bereich hinzufügen. Das funktioniert wie folgt:Wie bereits erwähnt, werden Datensätze am letzten Tag ignoriert, ohne so etwas zu tun.
Bearbeitet, um die Verwendung von
datetime.combine
- zu vermeiden. Es scheint logischer, sich beim VergleichDateTimeField
mit a an Datumsinstanzen zu halten , anstatt mit wegwerfbaren (und verwirrenden)datetime
Objekten herumzuspielen . Weitere Erläuterungen finden Sie in den Kommentaren unten.quelle
Example.objects.filter(created__range=[date(2014, 1, 1), date(2014, 2, 1)])
würde auch nicht selbst erstellte Objekte aufdate(2014, 2, 1)
, wie @cademan helfend erläutert. Wenn Sie jedoch das Enddatum um einen Tag erhöhen, erhalten Sie ein Abfrageset, das diese fehlenden Objekte abdeckt (und bequemerweise Objekte weglässt, diedate(2014, 2, 2)
aufgrund derselben Eigenart erstellt wurden). Das ärgerliche dabei ist, dass ein mit angegebener 'manueller' Bereichcreated__gte ... created__lte=date(2014, 2, 1)
auch nicht funktioniert, was meiner Meinung nach definitiv kontraintuitiv ist.Ist einfach,
Funktioniert bei mir
quelle
Um es flexibler zu gestalten, können Sie ein FilterBackend wie folgt entwerfen:
quelle
Noch heute relevant. Sie können auch tun:
quelle