В Peewee у меня есть поле даты и времени по умолчанию datetime.datetime.now(). Но при вставке занимает время запуска сервера. Почему

Когда я вставляю строку, поле заполняется временем запуска сервера, а не временем вставки строки. Почему это происходит и какое решение? Кстати, я использую SQLite.

class LOG(peewee.Model):
    id = peewee.IntegerField(unique=True,primary_key=True)
    timestamp = peewee.DateTimeField(default=datetime.datetime.now())
    log = peewee.CharField()
    by = peewee.IntegerField(default=1)
    class Meta:
        database = database


  LOG.create(log = _log , by = _by)  
  # above statement is called at say 3:00 pm and I started the server at 2:00 pm, then the row is inserted with timestamp of 2pm not 3pm.

person Sampad Mohanty    schedule 07.10.2015    source источник


Ответы (3)


Когда ваше поле загружается интерпретатором Python, он вызывает datetime.datetime.now() один и только один раз. Таким образом, вы всегда будете получать одно и то же значение.

Peewee поддерживает использование callables для аргументов по умолчанию, поэтому вместо вызова now() просто передайте функцию:

timestamp = peewee.DateTimeField(default=datetime.datetime.now)
person coleifer    schedule 24.10.2015
comment
Как использовать временные метки на стороне сервера? - person warvariuc; 04.12.2017
comment
Найдено: timestamp = DateTimeField(constraints=[SQL('DEFAULT CURRENT_TIMESTAMP')]) - person warvariuc; 04.12.2017

Это должно быть сделано так. Переопределить метод сохранения

class myModel(Model):

    name = CharField()
    timestamp = DateTimeField()

    def save(self, *args, **kwargs):
        self.timestamp = datetime.datetime.now()
        super(myModel, self).save(*args, **kwargs)

После этого исправления работает нормально

person Ashish    schedule 18.11.2016
comment
Это учитывает случай, когда существует разрыв между созданием экземпляра и сохранением, но не для приведенного выше примера, где он устанавливал по умолчанию значение datetime.datetime.now() (вызывается при загрузке кода модуля) в отличие от вызываемого datetime .datetime.now. - person coleifer; 20.11.2016

Требуется время компиляции (время запуска сервера)

[отредактировано], потому что вы использовали datetime.datetime.now() (со скобками). Как предложил @coleifer, вы можете использовать datetime.datetime.now (без скобок), чтобы инициировать вызов во время выполнения.

[старый ответ] Переопределение метода сохранения также будет работать

class LOG(peewee.Model):
    id = peewee.IntegerField(unique=True,primary_key=True)
    timestamp = peewee.DateTimeField()
    log = peewee.CharField()
    by = peewee.IntegerField(default=1)
    class Meta:
        database = database

    def save(self, *args, **kwargs):
        self.modified = datetime.datetime.now()
        return super(Something, self).save(*args, **kwargs)

Кажется дубликатом этого есть ли опция автоматического обновления для DateTimeField в peewee, как TimeStamp в MySQL?

person Anto    schedule 07.10.2015
comment
Это не совсем правильно. Peewee поддерживает вызываемые объекты, поэтому вы можете сказать default=datetime.datetime.now (без скобок). - person coleifer; 24.10.2015