Лучший способ добавить общие date_added, date_modified для многих моделей в Django - PullRequest
4 голосов
/ 24 декабря 2009

Я добавляю поля date_added и date_modified к группе общих моделей в моем текущем проекте. Я создаю подклассы models.Model и добавляю соответствующие поля, но я хочу добавить автоматическое поведение сохранения (то есть: каждый раз, когда кто-либо вызывает MyModel.save (), поле date_modified обновляется. Я вижу два подхода: переопределение метода save () или добавление обработчика сигнала pre_save в абстрактный базовый класс.

class CommonData(models.Model):
    date_added = models.DateTimeField(default=datetime.datetime.today,null=False,blank=False)
    date_modified = models.DateTimeField(default=datetime.datetime.today,null=True,blank=True)

    # register a handler for the pre_save to update date_modified
    def pre_save_handler(sender, **kwargs):
        date_modified = datetime.datetime.today

    def __init__():
        pre_save.connect(pre_save_handler, sender=self)

или

class CommonData(models.Model):
    date_added = models.DateTimeField(default=datetime.datetime.today,null=False,blank=False)
    date_modified = models.DateTimeField(default=datetime.datetime.today,null=True,blank=True)

    # overriding save 
    def save(force_insert=False,force_update=False):
        date_modified = datetime.datetime.now
        return models.Model.save(force_insert, force_update)

Я новичок в Django и Python, и мне интересно, какой подход был более "django"? Что является более эффективным? Какой «правильный» способ сделать это?

Ответы [ 4 ]

4 голосов
/ 24 декабря 2009

Вы пробовали смотреть DateTimeField auto_now=True и auto_now_add=True? Они делают то, что вам нужно, автоматически. В противном случае нет реальной разницы между выполнением переопределения сохранения и обработкой сигнала - фактически сигнал pre_save вызывается из метода сохранения модели django.

Документы: http://docs.djangoproject.com/en/dev/ref/models/fields/#datefield

4 голосов
/ 25 декабря 2009

Поскольку вы новичок в Django, вам могут пригодиться расширения команд Django:

http://code.google.com/p/django-command-extensions/

... которая включает в себя TimeStampedModel, из которой вы можете получить свои модели:

http://code.google.com/p/django-command-extensions/wiki/ModelExtensions

Абстрактная модель базового класса, которая предоставляет самоуправляемые «созданные» и «измененные» поля.

2 голосов
/ 24 декабря 2009

Вы можете определить их в Абстрактном базовом классе , а затем наследовать от него. Это похоже на MixIn, который также определяет поля модели.

1 голос
/ 22 января 2013

Обратите внимание, что auto_now_add и auto_now использует pre_save, который не работает, когда bulk_create или update. Так, например, в вашем MySQL поле date_added будет «0000-00-00 00:00:00», и можно получить предупреждение: «Предупреждение: столбец date_added не может быть пустым». Таким образом, вы можете использовать auto_now *, но вы должны быть осторожны.

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