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

Я хотел бы, чтобы поле метки времени обновлялось каждый раз, когда запись изменяется, как в MySQL.

DateTimeField(default=datetime.datetime.now()) установит его только при первом создании...

У кого-нибудь есть простое решение? Единственное решение - вручную установить параметры столбца в MySQL db?


person Xelt    schedule 29.08.2013    source источник


Ответы (3)


Вы можете переопределить метод save в классе вашей модели.

class Something(Model):
    created = DateTimeField(default=datetime.datetime.now)
    modified = DateTimeField

    def save(self, *args, **kwargs):
        self.modified = datetime.datetime.now()
        return super(Something, self).save(*args, **kwargs)
person coleifer    schedule 30.08.2013
comment
Пожалуйста, сообщите, как сделать то же самое для обновлений, например, Something.update(othercolumn=foo).where(id=2).execute(). Или мне нужно переписать свой код, чтобы вместо этого использовать Model.save()? Спасибо заранее. - person chrisinmtown; 07.03.2015
comment
Если вы вызываете .update(), вам может потребоваться реализовать логику обновления отметки времени на стороне SQL. update() не звонит save(). - person coleifer; 08.03.2015
comment
Есть ли способ переопределить класс Model в Peewee? - person Jeff; 16.10.2015
comment
Джефф, модели Peewees - это обычные занятия. Вы можете подклассифицировать их (т.е. создать BaseModel с различными полями по умолчанию, вспомогательными функциями и т. д.). - person Shayne; 06.07.2018

Просто используйте тип TIMESTAMP в MySQL. Это поле будет обновляться всякий раз, когда обновляется строка.

В model:

last_updated = peewee.TimestampField()
person ATOzTOA    schedule 11.08.2017
comment
Любые советы о том, как я могу сделать это для Postgresql? - person Kyrremann; 25.09.2018
comment
Это неправильно. Это сохранит текущую временную метку utc при создании, но НЕ будет обновлять ее при изменении строки (если вы не определите ограничение ON UPDATE) - person booshong; 04.11.2020

Вы также можете переопределить метод update для предоставления. Точно так же, как это делает coleifer:

class Something(Model):
    created = DateTimeField(default=datetime.datetime.now)
    modified = DateTimeField

    @classmethod
    def update(cls, *args, **kwargs):
        kwargs['modified'] = datetime.datetime.now()
        return super(Something, cls).save(*args, **kwargs)

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

Вы также можете сделать то же самое в методе replace

person leo zheng    schedule 26.12.2018
comment
Плохая идея. Никогда не следует переопределять методы генерации SQL (обновление, вставка, выбор и т. д.). - person coleifer; 27.12.2018
comment
Я бы сказал, что если логика достаточно сложна, ее добавление в такой шаг перед сохранением допустимо. Вам просто нужно убедиться, что вы используете правильные методы при CRUDing объектах (например, следует избегать update() и delete()). - person booshong; 04.11.2020