Django:模型最后的mod日期和mod计数

时间:2009-08-04 23:51:18

标签: django django-models django-admin

我有一个名为Blog的django模型。

我想在last_modified_date的当前模型中添加一个字段。我知道如何设置默认值,但我想以某种方式让它随时通过管理界面修改博客条目时自动更新。

是否有某种方法可以将此值强制为每个管理站点保存的当前时间?

还有一些方法可以添加mod_count字段,并在每次修改管理网站博客条目时自动计算它吗?

4 个答案:

答案 0 :(得分:12)

在模型中创建DateTimeField。每当保存时都会更新。这要求您使用auto_now_add选项:

class DateTimeField([auto_now=False, auto_now_add=False, **options])
  

DateTimeField.auto_now_add¶

     

每次保存对象时自动将字段设置为现在。有用   用于“最后修改”的时间戳。注意   始终使用当前日期;   它不仅仅是你的默认值   可以覆盖。

看起来应该是这样的:

class Message(models.Model):
    message = models.TextField()
    active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

Model field reference

对于第二部分,我认为你必须超载

ModelAdmin.save_model(self, request, obj, form, change)

James Bennett描述here。它看起来像这样:

class EntryAdmin(admin.ModelAdmin):

def save_model(self, request, obj, form, change):
    if change:
        obj.change_count += 1
    obj.save()

答案 1 :(得分:6)

接受的答案不再正确。

对于较新的django版本,您必须使用auto_now=True参数而不是auto_now_add=True,这只会在最初创建对象时设置字段值。

来自documentation

  

DateField.auto_now_add¶

     

当自动将字段设置为现在   首先创建对象。用于创建时间戳。

现在,auto_now实现了所需的功能:

  

DateField.auto_now¶

     

每次自动将字段设置为现在   对象被保存。

因此,为了实现自我更新时间戳,应该像这样创建一个模型:

class Message(models.Model):
    message = models.TextField()
    active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now=True)
    mod_count = models.IntegerField(default=0)

每次修改此模型时,要增加mod_count,请重载模型的save()方法:

    def save(self, *args, **kwargs):
        self.mod_count +=1
        return super(Message,self).save(*args, **kwargs)

答案 2 :(得分:2)

有很多方法可以在每次保存时增加编辑次数。

模型本身有一个save()方法,而admin模型有一个model_save()方法。

例如,假设您希望它在使用管理工具编辑时增加....

models.py:

class MyModel(models.Model):
    edit_count = models.IntegerField()
    # ... rest of model code here...


admin.py:

class MyModelAdmin(admin.ModelAdmin)
    def save_model(self, request, obj, form, change):
        if not change:
            obj.edit_count = 1
        else:
            obj.edit_count += 1
        obj.save()

您也可以在模型save()事件中执行类似的代码。


您可能感兴趣的其他内容是django-command-extensions。它添加了两个可能对您有帮助的字段:

  • CreationDateTimeField - DateTimeField,它将自动设置对象首次保存到数据库时的日期。

  • ModificationDateTimeField - DateTimeField,它将自动设置对象保存到数据库时的日期。

答案 3 :(得分:0)

您还可以使用此处找到的中间件解决方案:https://bitbucket.org/amenasse/django-current-user/src/7c3c90c8f5e854fedcb04479d912c1b9f6f2a5b9/current_user?at=default

settings.py

....
MIDDLEWARE_CLASSES = (
    .... 
    'current_user.middleware.CurrentUserMiddleware',
    'current_user.middleware.CreateUserMiddleware',
)
....
INSTALLED_APPS = (
    'current_user',
    ....
    ....
)

models.py

class ExampleModel(models.Model):
    foo = models.IntegerField()
    last_user = CurrentUserField(related_name="+")
    created_by = CreateUserField(related_name="+")