Две из моих моделей имеют поле даты и поле даты и времени. Они существуют в одном файле models.py, и я хотел бы установить их по умолчанию при добавлении в базу данных / в существование. Что еще более важно, я также хотел бы перезаписать эти поля для генерации моделей для их тестирования.

После некоторых исследований я начал использовать часовой пояс pytz и django.utils. Проблема, с которой я сталкиваюсь, - это ошибки времени выполнения, когда я пытаюсь перезаписать их, используя встроенный в python datetime (используя такие вещи, как timedelta и т. Д.). Поэтому я попытался преобразовать pytz.utc.localize (), но он пожаловался на то, что объекты datetime, которые я передал, не были наивными, но затем, когда я возвращаюсь к своей исходной версии, он по-прежнему выдает ошибку времени выполнения. Я нашел много способов преодолеть это, в основном используя такие вещи, как date = models.DateField(_("Date"), default=datetime.date.today), который требует import datetime, но проблема здесь в том, что я также хочу использовать DateTimeField, а теперь просто DateField. Поэтому я бы использовал date = models.DateField(_("Date"), default=date.today), но для этого требуется from datetime import date. Конфликт импорта, и все это портит мне

class SomeTime(models.Model):
    moment = models.DateTimeField(default=???, editable=True, blank=True)

class SomeDay(models.Model):
    date = models.DateField(default=???, editable=True, blank=True)

Я бы хотел пойти

m = SomeTime()

m.moment = #some datetime that I set, It should not throw a runtime error

m.save()

d = SomeDay()

d.date = #some date that I set, It should not throw a runtime error

d.save()

Помимо простого создания этих объектов, SomeTime должен сохранять текущую дату и время, а SomeDay должен сохранять текущую дату.

0
Heinrich Kreuser 4 Июл 2019 в 13:16

4 ответа

Лучший ответ

Вы находите проблемы там, где их нет. Если вам нужно импортировать дату и время, просто сделайте это. Или, что еще лучше, импортируйте модуль datetime и получите доступ к обоим классам внутри него.

import datetime


class SomeTime(models.Model):
    moment = models.DateTimeField(default=datetime.datetime.now, editable=True, blank=True)

class SomeDay(models.Model):
    date = models.DateField(default=datetime.date.today, editable=True, blank=True)

Или, если хотите, выполните from datetime.import datetime, date, затем default=datetime.now и default=date.today.

1
Daniel Roseman 4 Июл 2019 в 11:14

Для моделей. DateTimeField использовать:

from django.utils.dateparse import parse_datetime

# set default date
default_date = parse_datetime('2000-01-01T00:00:00')

class SomeTime(models.Model):
    date = models.DateTimeField(default=default_date)

Вы можете обновить это поле:

from django.utils.timezone import now

filtered_sometime.update(date = now)
# with usage of time delta
filtered_sometime.update(date = now() + relativedelta(months=-1))
0
Zaraki Kenpachi 4 Июл 2019 в 10:34

Вы должны импортировать дату и время в первую очередь.

import datetime

Затем из вашего кода.

now = datetime.datetime.now()

m = SomeTime()

m.moment = now

m.save()

d = SomeDay()

d.date = now.date()

d.save()
0
Nalin Dobhal 4 Июл 2019 в 10:29

Чтобы удалить предупреждение о времени выполнения, вы можете перейти к файлу settings.py и закомментировать «USE_TZ = True». Это всего лишь временное решение, мы хотели бы найти способ полностью избежать ошибок времени выполнения при рассмотрении международного использования

0
Heinrich Kreuser 6 Июл 2019 в 20:08