【问题标题】:Filtering using __range on a datetimefield在日期时间字段上使用 __range 进行过滤
【发布时间】:2019-01-27 12:05:27
【问题描述】:

我已经阅读并尝试了很多策略来使 __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 包含所有查询实例。请帮忙

【问题讨论】:

  • 可以分享一下模型吗? departure_date 是什么? DateField 还是 DateTimeFieldstart_dateend_date 的可能值是多少?
  • @WillemVanOnsem 问题已更新为 models.py

标签: django python-2.7 django-views jinja2


【解决方案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 等位于另一个时区,则数学可能不正确。所以有可能你需要对你得到的参数做一些“预处理”。

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 2018-01-07
    • 2018-02-21
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 2022-08-22
    • 1970-01-01
    相关资源
    最近更新 更多