ฉันมีฟิลด์ในหนึ่งโมเดลเช่น:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
ตอนนี้ฉันต้องกรองวัตถุตามช่วงวันที่
ฉันจะกรองวัตถุทั้งหมดที่มีวันที่ระหว่าง1-Jan-2011
และ31-Jan-2011
อย่างไร
ฉันมีฟิลด์ในหนึ่งโมเดลเช่น:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
ตอนนี้ฉันต้องกรองวัตถุตามช่วงวันที่
ฉันจะกรองวัตถุทั้งหมดที่มีวันที่ระหว่าง1-Jan-2011
และ31-Jan-2011
อย่างไร
คำตอบ:
ใช้
Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])
หรือถ้าคุณแค่พยายามกรองเดือนที่ชาญฉลาด:
Sample.objects.filter(date__year='2011',
date__month='01')
ดังที่ Bernhard Vallant กล่าวหากคุณต้องการชุดข้อมูลที่ไม่รวมspecified range ends
คุณควรพิจารณาโซลูชันของเขาซึ่งใช้ gt / lt (มากกว่า / น้อยกว่า)
__range
มีเส้นขอบ (เช่น SQL ของBETWEEN
) ถ้าคุณไม่ต้องการพรมแดนรวมที่คุณจะต้องไปกับฉัน gt โซลูชัน / ลิตร ...
order_by
มากกว่าสิ่งที่สร้างขึ้นQuerySet
filter
โดยการดังกล่าวข้างต้น ฉันไม่ได้ใช้ Django มาหลายปีแล้ว
คุณสามารถใช้djangofilter
กับdatetime.date
วัตถุ :
import datetime
samples = Sample.objects.filter(sampledate__gte=datetime.date(2011, 1, 1),
sampledate__lte=datetime.date(2011, 1, 31))
เมื่อทำช่วง django ด้วยตัวกรองตรวจสอบให้แน่ใจว่าคุณทราบความแตกต่างระหว่างการใช้วัตถุวันที่เทียบกับวัตถุวันที่และเวลา __range รวมอยู่ในวันที่ แต่ถ้าคุณใช้วัตถุ datetime สำหรับวันที่สิ้นสุดมันจะไม่รวมรายการสำหรับวันนั้นหากไม่ได้ตั้งเวลาไว้
startdate = date.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])
ส่งคืนรายการทั้งหมดจาก startdate ถึง enddate รวมถึงรายการในวันที่เหล่านั้น ตัวอย่างที่ไม่ดีเนื่องจากนี่คือการส่งคืนรายการต่อสัปดาห์ในอนาคต แต่คุณจะได้รับการเลื่อน
startdate = datetime.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])
จะหายไป 24 ชั่วโมงมูลค่ารายการขึ้นอยู่กับเวลาสำหรับฟิลด์วันที่ที่ถูกตั้งค่าเป็น
date
วัตถุ: >>> from datetime import date
>>> startdate = date.today()
คุณจะได้รับรอบ "ต้านทานไม่ตรงกัน" เกิดจากการขาดความแม่นยำในการDateTimeField/date
เปรียบเทียบวัตถุ - ที่สามารถเกิดขึ้นได้หากใช้ช่วง - โดยใช้datetime.timedeltaเพื่อเพิ่มวันถึงวันสุดท้ายในช่วง งานนี้ชอบ:
start = date(2012, 12, 11)
end = date(2012, 12, 18)
new_end = end + datetime.timedelta(days=1)
ExampleModel.objects.filter(some_datetime_field__range=[start, new_end])
ตามที่กล่าวไว้ก่อนหน้านี้โดยไม่ทำสิ่งนี้บันทึกจะถูกละเว้นในวันสุดท้าย
แก้ไขเพื่อหลีกเลี่ยงการใช้datetime.combine
- ดูเหมือนมีเหตุผลมากกว่าที่จะยึดติดกับอินสแตนซ์วันที่เมื่อเปรียบเทียบกับ a DateTimeField
แทนที่จะยุ่งเกี่ยวกับdatetime
วัตถุที่ถูกโยนทิ้ง (และทำให้สับสน) ดูคำอธิบายเพิ่มเติมในความคิดเห็นด้านล่าง
Example.objects.filter(created__range=[date(2014, 1, 1), date(2014, 2, 1)])
จะไม่รวมวัตถุที่สร้างขึ้นdate(2014, 2, 1)
เช่น @cademan อธิบายอย่างเป็นประโยชน์ แต่ถ้าคุณเพิ่มขึ้นวันที่สิ้นสุดโดยการเพิ่มวันหนึ่งคุณจะได้รับชุดข้อความค้นหาที่ครอบคลุมวัตถุที่หายไปเหล่านั้น (และสะดวกถนัดวัตถุที่สร้างขึ้นบนdate(2014, 2, 2)
เพราะมุมแหลมเดียวกัน) สิ่งที่น่ารำคาญที่นี่คือช่วง 'คู่มือ' ที่ระบุด้วยcreated__gte ... created__lte=date(2014, 2, 1)
ไม่ทำงานซึ่งเป็น IMHO ที่ตอบโต้ได้ง่ายอย่างแน่นอน
ง่ายมาก
YourModel.objects.filter(YOUR_DATE_FIELD__date=timezone.now())
ใช้งานได้สำหรับฉัน
เพื่อให้มีความยืดหยุ่นมากขึ้นคุณสามารถออกแบบ FilterBackend ดังนี้:
class AnalyticsFilterBackend(generic_filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
predicate = request.query_params # or request.data for POST
if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is not None:
queryset = queryset.filter(your_date__range=(predicate['from_date'], predicate['to_date']))
if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is None:
queryset = queryset.filter(your_date__gte=predicate['from_date'])
if predicate.get('to_date', None) is not None and predicate.get('from_date', None) is None:
queryset = queryset.filter(your_date__lte=predicate['to_date'])
return queryset
ยังคงมีความเกี่ยวข้องในวันนี้ คุณยังสามารถทำสิ่งต่อไปนี้
import dateutil
import pytz
date = dateutil.parser.parse('02/11/2019').replace(tzinfo=pytz.UTC)