首页 > 解决方案 > Django 时区过滤器返回错误结果

问题描述

我写了以下代码:

date = self.request.query_params.get('date')       
queryset = Fixture.objects.all().order_by('-date')
        
if(date):
    date = pytz.utc.localize(datetime.strptime(date, "%Y-%m-%d")).astimezone(pytz.UTC)
    queryset = Fixture.objects.filter(date__date=date).order_by('date')

使用查询集执行此操作后,date = "2020-09-02"将返回包含日期“2020-09-03”的值。这是怎么发生的,如何解决?

标签: pythondjango

解决方案


如果您想使用日期,为什么要先将其设为日期时间?您的解析可以简化。

date = self.request.query_params.get('date')       
queryset = Fixture.objects.all().order_by('-date')
        
if date:
    date = datetime.strptime(date, "%Y-%m-%d").date()
    queryset = Fixture.objects.filter(date__date=date).order_by('date')

但是这种解析对错误插入的数据也很敏感,你会得到一个错误。最佳实践 imo 将使用 DateField 创建一个简单的表单。

class ParseDateForm(forms.Form):
    date = forms.DateField()

# This somewhere in a method
form = ParseDateForm(data=self.request.query_params)
queryset = Fixture.objects.all().order_by('-date')
        
if form.is_valid():
    date = form.cleaned_data['date']
    queryset = Fixture.objects.filter(date__date=date).order_by('date')


推荐阅读