Saya punya bidang dalam satu model seperti:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
Sekarang, saya perlu memfilter objek berdasarkan rentang tanggal.
Bagaimana cara memfilter semua objek yang memiliki tanggal antara 1-Jan-2011
dan 31-Jan-2011
?
python
django
django-models
django-queryset
pengguna469652
sumber
sumber
__range
termasuk perbatasan (seperti sqlBETWEEN
), jika Anda tidak ingin perbatasan termasuk Anda harus pergi dengan solusi gt / lt saya ...order_by
lebih dari yang dihasilkanQuerySet
oleh yang disebutkan di atasfilter
. Saya sudah bertahun-tahun tidak menggunakan Django.Anda dapat menggunakan django
filter
dengandatetime.date
objek :sumber
Saat melakukan rentang Django dengan filter, pastikan Anda tahu perbedaan antara menggunakan objek tanggal vs objek datetime. __range termasuk pada tanggal tetapi jika Anda menggunakan objek datetime untuk tanggal akhir itu tidak akan memasukkan entri untuk hari itu jika waktu tidak ditetapkan.
mengembalikan semua entri dari tanggal mulai hingga tanggal termasuk entri pada tanggal tersebut. Contoh buruk karena ini mengembalikan entri seminggu ke masa depan, tetapi Anda mendapatkan penyimpangan.
akan hilang 24 jam senilai entri tergantung pada apa waktu untuk bidang tanggal diatur.
sumber
date
objek:>>> from datetime import date
>>> startdate = date.today()
Anda dapat menyiasati "ketidakcocokan impedansi" yang disebabkan oleh kurangnya presisi dalam
DateTimeField/date
perbandingan objek - yang dapat terjadi jika menggunakan rentang - dengan menggunakan datetime.timedelta untuk menambahkan hari ke tanggal terakhir dalam rentang. Ini berfungsi seperti:Seperti dibahas sebelumnya, tanpa melakukan sesuatu seperti ini, catatan diabaikan pada hari terakhir.
Diedit untuk menghindari penggunaan
datetime.combine
- tampaknya lebih logis untuk tetap menggunakan instance date ketika membandingkan denganDateTimeField
, bukannya mengotak-atik objek yang dibuang (dan membingungkan)datetime
. Lihat penjelasan lebih lanjut dalam komentar di bawah.sumber
Example.objects.filter(created__range=[date(2014, 1, 1), date(2014, 2, 1)])
tidak akan menyertakan objek yang dibuatdate(2014, 2, 1)
, seperti yang dijelaskan oleh @cademan. Tetapi jika Anda menambah tanggal akhir dengan menambahkan satu hari, Anda akan mendapatkan queryset yang menutupi objek-objek yang hilang (dan dengan mudah menghilangkan objek yang dibuatdate(2014, 2, 2)
karena kekhasan yang sama). Yang menjengkelkan di sini adalah bahwa rentang 'manual' yang ditentukan dengancreated__gte ... created__lte=date(2014, 2, 1)
tidak berfungsi baik, yang pasti IMHO kontra-intuitif.Sederhana,
Bekerja untukku
sumber
Untuk membuatnya lebih fleksibel, Anda bisa mendesain FilterBackend seperti di bawah ini:
sumber
Masih relevan hari ini. Anda juga dapat melakukan:
sumber