Saya mencoba memfilter DateTimeField
perbandingan dengan tanggal. Maksudku:
MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))
Saya mendapatkan daftar queryset kosong sebagai jawaban karena (saya pikir) saya tidak mempertimbangkan waktu, tetapi saya ingin "kapan saja".
Apakah ada cara mudah di Django untuk melakukan ini?
Saya punya waktu di datetime diselesaikan, tidak 00:00
.
Jawaban:
Pencarian tersebut diimplementasikan
django.views.generic.date_based
sebagai berikut:Karena cukup verbose ada rencana untuk meningkatkan sintaks menggunakan
__date
operator. Periksa " # 9596 Membandingkan DateTimeField ke tanggal terlalu sulit " untuk detail lebih lanjut.sumber
Q(created__gte=datetime.combine(created_value, time.min))
Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
// edit setelah komentar
doest tidak berfungsi karena ia membuat objek datetime dengan nilai waktu yang ditetapkan ke 0, sehingga waktu dalam database tidak cocok.
sumber
Berikut adalah hasil yang saya dapatkan dengan fungsi timeit ipython:
mengandung sepertinya lebih cepat.
sumber
contains
solusinya, saya mendapatkan pesan kesalahan:Unable to get repr for <class 'django.db.models.query.QuerySet'>
__contains
filter. Tetapi jika Anda mengalami masalah Anda harus mencoba contoh dokumen Django yang menggunakan__gte
.startswith
solusinya ..Sekarang Django memiliki filter queryset __date untuk menanyakan objek datetime terhadap tanggal dalam versi pengembangan. Dengan demikian, itu akan tersedia dalam 1,9 segera.
sumber
di atas adalah apa yang saya gunakan. Tidak hanya berfungsi, itu juga memiliki beberapa dukungan logis yang melekat.
sumber
Pada Django 1.9, cara untuk melakukan ini adalah dengan menggunakan
__date
objek datetime.Sebagai contoh:
MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))
sumber
Ini menghasilkan hasil yang sama seperti menggunakan __year, __month, dan __day dan sepertinya bekerja untuk saya:
sumber
dengan asumsi active_on adalah objek tanggal, tambahkan 1 hari kemudian lakukan rentang
sumber
Berikut adalah teknik yang menarik - Saya memanfaatkan prosedur startswith seperti yang diterapkan dengan Django pada MySQL untuk mencapai hasil hanya mencari datetime hanya melalui tanggal. Pada dasarnya, ketika Django melakukan pencarian dalam database, ia harus melakukan konversi string untuk objek penyimpanan DATETIME MySQL, sehingga Anda dapat memfilternya, meninggalkan bagian stempel waktu tanggal - dengan cara itu% LIKE% hanya cocok dengan tanggal objek dan Anda akan mendapatkan setiap cap waktu untuk tanggal yang diberikan.
Ini akan melakukan kueri berikut:
LIKE BINARY dalam hal ini akan cocok dengan segalanya untuk tanggal, tidak peduli cap waktu. Termasuk nilai-nilai seperti:
Semoga ini membantu semua orang sampai Django keluar dengan solusi!
sumber
Ada blogpost fantastis yang membahas hal ini di sini: Membandingkan Tanggal dan Waktu di Django ORM
Solusi terbaik untuk Django> 1.7, <1.9 adalah dengan mendaftarkan transformasi:
Kemudian Anda dapat menggunakannya di filter Anda seperti ini:
EDIT
Solusi ini pasti tergantung ujung belakang. Dari artikel:
sumber
return '{}::date'.format(lhs), params
Hm .. Solusi saya berfungsi:
sumber
sumber
Dalam Django 1.7.6 karya:
sumber
__lte
misalnya.Lihat artikel Dokumentasi Django
sumber