Próbuję odfiltrować DateTimeField
porównanie z datą. Mam na myśli:
MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))
Otrzymuję pustą listę zestawów zapytań jako odpowiedź, ponieważ (myślę) nie biorę pod uwagę czasu, ale chcę „kiedykolwiek”.
Czy w Django jest na to łatwy sposób?
Mam ustawiony czas w dacie i czasie, tak nie jest 00:00
.
Odpowiedzi:
Takie wyszukiwania są realizowane w
django.views.generic.date_based
następujący sposób:Ponieważ jest dość rozwlekły, planowane jest ulepszenie składni za pomocą
__date
operatora. Sprawdź „ # 9596 Porównywanie pola DateTimeField z datą jest zbyt trudne ”, aby uzyskać więcej informacji.źródło
Q(created__gte=datetime.combine(created_value, time.min))
Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
// edytuj po komentarzach
nie działa, ponieważ tworzy obiekt daty i godziny z wartościami czasu ustawionymi na 0, więc czas w bazie danych nie jest zgodny.
źródło
Oto wyniki, które otrzymałem dzięki funkcji timeit ipythona:
zawiera wydaje się być szybszy.
źródło
contains
rozwiązania to wyskakuje mi komunikat o błędzie:Unable to get repr for <class 'django.db.models.query.QuerySet'>
__contains
filtr. Ale jeśli napotkasz problemy, powinieneś wypróbować przykład django docs, który używa__gte
.startswith
rozwiązanie…Teraz Django ma filtr __date queryset do wykonywania zapytań dotyczących obiektów datetime względem dat w wersji rozwojowej. W związku z tym wkrótce będzie dostępny w wersji 1.9.
źródło
powyższe jest tym, czego użyłem. Nie tylko działa, ale ma również nieodłączne logiczne podłoże.
źródło
Od wersji Django 1.9 sposobem na to jest użycie
__date
obiektu datetime.Na przykład:
MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))
źródło
Daje to takie same wyniki, jak użycie __year, __month i __day i wydaje się działać dla mnie:
źródło
zakładając, że active_on jest obiektem daty, zwiększ go o 1 dzień, a następnie wykonaj zakres
źródło
Oto interesująca technika - wykorzystałem procedurę startedwith zaimplementowaną w Django w MySQL, aby uzyskać wynik wyszukiwania tylko daty i godziny tylko przez datę. Zasadniczo, gdy Django szuka w bazie danych, musi wykonać konwersję ciągów znaków dla obiektu pamięci MySQL DATETIME, więc możesz filtrować według tego, pomijając część daty z datownikiem - w ten sposób% LIKE% pasuje tylko do daty obiekt, a otrzymasz każdy znacznik czasu dla podanej daty.
Spowoduje to wykonanie następującego zapytania:
LIKE BINARY w tym przypadku dopasuje wszystko do daty, bez względu na sygnaturę czasową. W tym wartości takie jak:
Miejmy nadzieję, że pomoże to wszystkim, dopóki Django nie wyjdzie z rozwiązaniem!
źródło
Jest fantastyczny post na blogu, który omawia to tutaj: Porównanie dat i czasów w ORM Django
Najlepszym rozwiązaniem opublikowanym dla Django> 1.7, <1.9 jest zarejestrowanie transformacji:
Następnie możesz użyć go w swoich filtrach w następujący sposób:
EDYTOWAĆ
To rozwiązanie jest zdecydowanie zależne od zaplecza. Z artykułu:
źródło
return '{}::date'.format(lhs), params
Hm ... Moje rozwiązanie działa:
źródło
źródło
W Django 1.7.6 działa:
źródło
__lte
na przykład.Zobacz artykuł Dokumentacja Django
źródło