ฉันมีฟิลด์ในหนึ่งโมเดลเช่น:
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มากกว่าสิ่งที่สร้างขึ้นQuerySetfilterโดยการดังกล่าวข้างต้น ฉันไม่ได้ใช้ 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)