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

Net*_*zen 7 django django-models django-admin

我有一个叫django的模型Blog.

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

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

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

hug*_*own 12

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

class DateTimeField([auto_now=False, auto_now_add=False, **options])
Run Code Online (Sandbox Code Playgroud)

DateTimeField.auto_now_add

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

它应该看起来像这样:

class Message(models.Model):
    message = models.TextField()
    active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

模型字段参考

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

ModelAdmin.save_model(self, request, obj, form, change)
Run Code Online (Sandbox Code Playgroud)

正如James Bennett 在这里描述的那样.它看起来像这样:

class EntryAdmin(admin.ModelAdmin):

def save_model(self, request, obj, form, change):
    if change:
        obj.change_count += 1
    obj.save()
Run Code Online (Sandbox Code Playgroud)


Seb*_*zny 6

接受的答案不再正确.

对于较新的django版本,您将不得不使用auto_now=True参数而不是auto_now_add=True,这将仅在最初创建对象时设置字段值.

文档:

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)
Run Code Online (Sandbox Code Playgroud)

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

    def save(self, *args, **kwargs):
        self.mod_count +=1
        return super(Message,self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)