Ich versuche einen DateTimeField
Vergleich mit einem Datum zu filtern . Ich meine:
MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))
Ich bekomme eine leere Abfragesatzliste als Antwort, weil ich (glaube ich) nicht über Zeit nachdenke, sondern "jederzeit" möchte.
Gibt es in Django einen einfachen Weg, dies zu tun?
Ich habe die Zeit in der Datumszeit festgelegt, es ist nicht 00:00
.
Antworten:
Solche Suchvorgänge werden
django.views.generic.date_based
wie folgt implementiert :Da es ziemlich ausführlich ist, gibt es Pläne, die Syntax mit dem
__date
Operator zu verbessern . Weitere Informationen finden Sie unter " # 9596 Das Vergleichen eines DateTimeField mit einem Datum ist zu schwierig ".quelle
Q(created__gte=datetime.combine(created_value, time.min))
Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
// nach Kommentaren bearbeiten
funktioniert nicht, da ein datetime-Objekt mit auf 0 gesetzten Zeitwerten erstellt wird, sodass die Zeit in der Datenbank nicht übereinstimmt.
quelle
Hier sind die Ergebnisse, die ich mit der Timeit-Funktion von ipython erhalten habe:
enthält scheint schneller zu sein.
quelle
contains
Lösung versuche , erhalte ich die Fehlermeldung:Unable to get repr for <class 'django.db.models.query.QuerySet'>
__contains
Filter verursacht wird . Aber wenn Sie in Probleme laufen sollten Sie versuchen django docs Beispiel , die verwendet__gte
.startswith
Lösung ..Jetzt verfügt Django über einen __date-Abfragesatzfilter, um datetime-Objekte anhand von Datumsangaben in der Entwicklungsversion abzufragen. Somit wird es bald in 1.9 verfügbar sein.
quelle
Das Obige habe ich benutzt. Es funktioniert nicht nur, es hat auch einen inhärenten logischen Hintergrund.
quelle
Ab Django 1.9 können Sie dazu
__date
ein datetime-Objekt verwenden.Beispielsweise:
MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))
quelle
Dies führt zu den gleichen Ergebnissen wie die Verwendung von __Jahr, __Monat und __Tag und scheint für mich zu funktionieren:
quelle
Angenommen, active_on ist ein Datumsobjekt, erhöhen Sie es um 1 Tag und führen Sie dann den Bereich aus
quelle
Hier ist eine interessante Technik: Ich habe die mit Django unter MySQL implementierte Startswith-Prozedur genutzt, um das Ergebnis zu erzielen, dass nur eine Datums- / Uhrzeitangabe nur über das Datum nachgeschlagen wird. Wenn Django die Suche in der Datenbank durchführt, muss grundsätzlich eine Zeichenfolgenkonvertierung für das DATETIME MySQL-Speicherobjekt durchgeführt werden, damit Sie danach filtern können, wobei der Zeitstempelteil des Datums weggelassen wird. Auf diese Weise stimmt% LIKE% nur mit dem Datum überein Objekt und Sie erhalten jeden Zeitstempel für das angegebene Datum.
Dadurch wird die folgende Abfrage ausgeführt:
In diesem Fall entspricht LIKE BINARY dem Datum, unabhängig vom Zeitstempel. Einschließlich Werte wie:
Hoffentlich hilft das allen, bis Django eine Lösung findet!
quelle
Es gibt einen fantastischen Blogpost, der dies hier behandelt: Vergleichen von Daten und Daten im Django ORM
Die beste Lösung für Django> 1.7, <1.9 ist das Registrieren einer Transformation:
Dann können Sie es in Ihren Filtern wie folgt verwenden:
BEARBEITEN
Diese Lösung ist definitiv vom Backend abhängig. Aus dem Artikel:
quelle
return '{}::date'.format(lhs), params
Hm .. Meine Lösung funktioniert:
quelle
quelle
In Django 1.7.6 funktioniert:
quelle
__lte
beispielsweise nicht verwenden können .Siehe den Artikel Django-Dokumentation
quelle