Измените значение модели при извлечении в django

#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)