Django DateTimeField получил наивную дату и время, когда активна поддержка часового пояса. - PullRequest
2 голосов
/ 06 марта 2020

Я использую Django 2.2

В моем приложении поддержка часового пояса включена USE_TZ = True в файле настроек.

У меня есть модели с полем DateTime created.

Мне нужно отфильтровать данные по дате. Дата может быть предоставлена ​​пользователем, иначе она будет по умолчанию now().

Это то, что я делаю

from datetime import datetime, timedelta
from django.utils import timezone

class Generator:

    def __init__(self, start_date=None, end_date=None):

        if end_date:
            self.end_date = datetime.strptime(end_date, '%Y-%m-%d').date()
        else:
            self.end_date = timezone.now().date()

        if start_date:
            self.start_date = datetime.strptime(start_date, '%Y-%m-%d').date()
        else:
            self.start_date = self.end_date - timedelta(days=7)

    def get_query(self, d):

        query = MyModel.objects.filter(
            d__in=d,
            created__gte=start_date,
            created__lte=end_date
        )

        return query

Но это дает ошибку

RuntimeWarning: DateTimeField MyModel.created received a naive datetime (2020-02-28 00:00:00) while time zone support is active.

Как решить эту проблему?

Ответы [ 3 ]

1 голос
/ 06 марта 2020

Вы можете добавить следующий код, чтобы гарантировать, что start_date и end_date имеют информацию о часовом поясе. Например,

tz = timezone.get_current_timezone()

start_date = start_date.replace(tzinfo=tz)
end_date = end_date.replace(tzinfo=tz)
0 голосов
/ 06 марта 2020

Когда включена поддержка часовых поясов, слой базы данных ожидает получать только осведомленные даты и времени из вашего кода. Это предупреждение появляется, когда он получает наивную дату и время. Это указывает на то, что вы еще не закончили перенос кода для поддержки часовых поясов. проверьте документацию .

Вам необходимо изменить наивное время-дату на дату-время вашего часового пояса проекта, используя функцию make_aware(). Для этого вы должны обновить свой код, как показано ниже.

from datetime import datetime, timedelta
from django.utils import timezone

class Generator:

    def get_mytimezone_date(original_datetime):
        new_datetime = datetime.strptime(original_datetime, '%Y-%m-%d')
        tz = timezone.get_current_timezone()
        timzone_datetime = timezone.make_aware(new_datetime, tz, True)
        return timzone_datetime.date()

    def __init__(self, start_date=None, end_date=None):

        if end_date:
            self.end_date = self.get_mytimezone_date(end_date)
        else:
            self.end_date = timezone.now().date()

        if start_date:
            self.start_date = self.get_mytimezone_date(start_date)
        else:
            self.start_date = self.end_date - timedelta(days=7)

    def get_query(self, d):

        query = MyModel.objects.filter(
            d__in=d,
            created__gte=start_date,
            created__lte=end_date
        )

        return query

Надеюсь, это поможет вам:)

0 голосов
/ 06 марта 2020

Чтобы не получать наивное дата-время, если myday - строка, представляющая дату, конвертируйте ее непосредственно в дату следующим образом:

from time import strptime

myday = date(*strptime(myday, "%Y-%m-%d")[:3])

Этот метод позволяет избежать необходимости переводить из наивного в осведомленное время-дату .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...