#django
#джанго
Вопрос:
У меня есть модель, которая сохраняет created_at в формате UTC в базе данных. Когда я хочу показать его пользователю, я хочу, чтобы дата и время отображались в заданной мной settings.py
временной зоне (которая называется «Азия/Джакарта»). Прямо сейчас каждый раз, когда я хочу показать его пользователю, мне приходится вручную изменять его с помощью timezone.localtime()
. Есть ли способ автоматически установить дату и время на «Азия/Джакарта» при извлечении поля из модели?
Вот моя модель:
from django.db import models class Product(models.Model): name = models.CharField(max_length=255) quantity = models.IntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = 'product' def __str__(self): return self.name
Вот мой settings.py
:
LANGUAGE_CODE = 'en-us' TIME_ZONE = 'Asia/Jakarta' USE_I18N = True USE_L10N = True USE_TZ = True
Результат в оболочке django:
gt;gt;gt; from product.models import Product gt;gt;gt; product = Product.objects.get(pk=1) gt;gt;gt; product.created_at datetime.datetime(2021, 11, 29, 13, 48, 9, 953290, tzinfo=lt;UTCgt;) gt;gt;gt; from django.utils import timezone gt;gt;gt; timezone.localtime(product.created_at) datetime.datetime(2021, 11, 29, 20, 48, 9, 953290, tzinfo=lt;DstTzInfo 'Asia/Jakarta' WIB 7:00:00 STDgt;) lt;-- Expected result
Обновить:
Я нашел решение. И решение состоит в том, чтобы создать пользовательское поле даты и времени и переопределить метод from_db_value
from django.conf import settings from django.db import models from django.utils import timezone class CustomDateTimeField(models.DateTimeField): def from_db_value(self, value, expression, connection): if value is None: return value if settings.USE_TZ: return timezone.localtime(value) return value
И в модели используйте его так
created_at = CustomDateTimeField(auto_now_add=True)