在日期时间字段上使用__range进行过滤

时间:2018-08-21 10:09:15

标签: django python-2.7 django-views jinja2

我已经阅读并尝试了许多策略来使__range包含在内。请有人在这里帮忙

views.py

def generate_report(request):

    if 'start_date' and 'end_date' in request.GET:
        account_type = AccountUser.objects.get(user_id=request.user.id)

        query_string_start = request.GET.get('start_date')
        query_string_end = request.GET.get('end_date')


        search_query = BedAllotment.objects.filter(hospital_id=account_type.hospital_id,
                                                   departure_date__gte=query_string_start, departure_date__lte=query_string_end).order_by('-departure_date')

        return render (request, 'report/report_preview.html', {'account_type':account_type, 'query_data':search_query,
                                                               'query_string_start': query_string_start,
                                                               'query_string_end':query_string_end})

models.py

class BedAllotment(models.Model):
    BILL_TO = (
        ('self', 'Self'),
        ('insurance', 'Insurance')
    )
    PAYMENT_MODE = (
        ('cash', 'Cash'),
        ('cheque', 'Cheque'),
        ('transfer', 'Transfer'),
        ('pos', 'POS'),
    )

    hospital = models.ForeignKey(Hospital)
    patient = models.ForeignKey(PatientProfile)
    bed = models.ForeignKey(BedCreate)
    allotment_date = models.DateTimeField(auto_now_add=True)
    departure_date = models.DateTimeField(blank=True, null=True)
    days = models.IntegerField(null=True, blank=False)
    amount = models.IntegerField(null=True, blank=False)
    amount_paid = models.IntegerField(default=0, blank=False)
    discount = models.IntegerField(default=0, blank=False)
    status = models.BooleanField(default=False)

我想在end_date包括所有查询实例。请帮助

1 个答案:

答案 0 :(得分:1)

如果我正确理解,depart_dateDateTimeField。现在,假设日期时间为2018-08-21 12:34,那么它比2018-08-21大,因为默认情况下,日期被假定为时间00:00

不过,我们可以使用__date查找,例如:

search_query = BedAllotment.objects.filter(
    hospital_id=account_type.hospital_id,
    departure_date__date__range=(query_string_start, query_string_end)
).order_by('-departure_date')

这意味着我们首先将departure_date“转换”为等效的DateField值,然后检查它是否在范围内。

请注意,日期/时间很复杂:日期取决于时区,因此,如果query_string_start等位于另一个时区中,则数学运算可能不正确。因此,可能需要对获取的参数进行一些“预处理”。