django - 在 Django/DRF 中正确处理日期时间/时区

标签 django datetime django-rest-framework timezone

我正在尝试为我的网络应用程序进行适当的日期处理设置。我有一个看起来像这样的模型

class Entity(models.Model):
    name = models.CharField(max_length=255)
    date = models.DateTimeField()

用户可以向我的 DRF 端点发送请求 /api/v1/entity/获取此类实体的列表。现在要求用户应该能够请求所有 Entity一天的对象,由日期参数确定。日期以 UTC 格式存储在数据库中,而此应用程序的用户不在 UTC 时区。

用户可以创建具有以下日期的实体 2018-06-19T01:00:00+02:00 ,存储为 2018-06-18T23:00:00Z在数据库中。现在,如果我尝试列出用户为 2018-06-19 创建的所有实体没有返回任何内容,但按 2018-06-18 过滤返回一个条目。

这是我正在使用的代码设置:http://127.0.0.1:8000/api/v1/entity/?date=2018-06-18 .
def get_queryset(self):
    user = self.request.user
    entities = Entity.objects.filter(owner=user)
    date = self.request.query_params.get('date')
    if date:
        entities = entities.filter(date__date=date)
    return entities

所以在这种情况下,合适的日期范围是 2018-06-18T23:00:00Z - 2018-06-19T23:00:00Z .在用户的时区中获取一天(或日期范围)的所有实体的正确方法是什么?

最佳答案

如果我理解正确,您必须转换本地 DateTime 相当于 UTC 时间和查询到数据库。所以我在下面定义了一个简单的时间转换函数
import pytz from datetime import datetime def convert_to_UTC(local_tz,dt_1,dt_2): """ local_tz : any possible timezone which supports pytz lib (https://stackoverflow.com/questions/13866926/is-there-a-list-of-pytz-timezones) dt_1 and dt_2 : local datetime in string in this format ->> '%Y-%m-%dT%H:%M:%S' return a list as ->> [utc_equivalent_of_dt_1_in_string,utc_equivalent_of_dt_2_in_string] """ format='%Y-%m-%dT%H:%M:%S' pytz_local_tz = pytz.timezone(local_time_zone) dt_obj_from_date_time = datetime.strptime(dt_1,format) dt_obj_to_date_time = datetime.strptime(dt_2,format) return [pytz_local_tz.localize(dt_obj_from_date_time).astimezone(tz=pytz.utc).strftime(format), pytz_local_tz.localize(dt_obj_to_date_time).astimezone(tz=pytz.utc).strftime(format)]
要使用此功能,请更改您的 get_queryset()方法如下,
def get_queryset(self): user = self.request.user entities = Entity.objects.filter(owner=user) date_from = self.request.query_params.get('date_from') date_to = self.request.query_params.get('date_to') if date_from and date_to: entities = entities.filter(date__range=convert_to_UTC('Asia/Kolkata', date_from, date_to)) return entities
因此网址将类似于,/api/v1/entity/?date_from=2018-06-18T23:00:00&date_to=2018-06-19T23:00:00

关于django - 在 Django/DRF 中正确处理日期时间/时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50930026/

相关文章:

MYSQL 将日期和时间字段合并为日期时间值

java - Java 是否有一个好的*严格*日期解析器?

php - 如何在 php laravel 应用程序路由中处理从 API 端点(django 应用程序)返回的数据

Django Rest框架批量创建

python - 在django中保存递增字典的数据

django - 使用 root 权限运行 Django API 服务器可以吗?

C#:实现格式良好的时间字符串的最佳方法?

python - 将 JSON 对象列表转换为 Django 模型实例

django - 使用 fpm 制作 deb 包时设置自定义安装目录

python - OperationalError,没有这样的列。 Django