django - 值更改后自动更新日期

时间:2015-08-06 14:28:23

标签: python django datetime python-3.x

在以下django模型中:

class MyModel(models.Model):
    published = models.BooleanField(default=False)
    pub_date = models.DateTimeField('date published')

我希望每次发布的字段更改为True时,都会使用当前日期自动更新pub_date字段。

智能方式是什么?

感谢。

6 个答案:

答案 0 :(得分:8)

如果发布已从False修改为True,则以下仅更改pub_date:

%IF %symexist(&Z)=0 %THEN %LET Z = ;

答案 1 :(得分:7)

如果您要将对象设置为在Django管理员中发布,那么执行此操作的一种好方法是覆盖模型管理类的save_model方法。

from datetime import datetime

from django.contrib import admin


class MyModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if obj.published and 'published' in form.changed_data
            obj.pub_date = datetime.now()
            obj.save()

admin.site.register(MyModel, MyModelAdmin)

如果您要将发布的标记设置在其他位置,则可以覆盖save()方法,或使用pre_save信号。这不是那么优雅,因为很难判断published标志是否已经改变。我想你需要从数据库中重新获取对象来检查。

答案 2 :(得分:7)

所有答案都很有用,但我终于这样做了:

int values[num];

int func(int a, int b, int c)
{
    int i=0;
    int total=0;
    for(i=0; i<num; i++){
        total = a*b+c;
    }
    return total;
}

int main(void){
    int i=0;
    int min=0;
    for(i=0; i<num; i++){
        values[i] = func(a, b, c);
    }

    for(i=0; i<num; i++){
        value = values[i];
    }
    printf("value: %d\n", value);
    return 0;
}

答案 3 :(得分:5)

您想要添加auto_now字段并将其设置为True。每次更新模型时,都会使用当前时间戳进行更新。

pub_date = models.DateTimeField('date_published', auto_now=True)

您可以阅读here

修改

很抱歉,您真的只想更改已发布的值设置为True时的时间戳。一个非常简单的方法是获取模型的原始值,然后覆盖save方法,以便在设置为True时更新。以下是您添加到代码中的内容:

class MyModel(models.Model):
    published = models.BooleanField(default=False)
    pub_date = models.DateTimeField('date published')

    def __init__(self, *args, **kwargs):
        super(MyModel, self).__init__(*args, **kwargs)
        self._published = self.published

    def save(self, *args, **kwargs):
        if not self._published and self.published:
            self.pub_date = django.timezone.now()
        super(MyModel, self).save(*args, **kwargs)

答案 4 :(得分:2)

创建 setdiff(colnames(x.2), colnames(x.1)) 方法:

publish()

答案 5 :(得分:0)

正义替代更新方法

from django.utils import timezone


class Vehicle(models.Model):

    class Meta:
        ordering = ['-created']

    created = models.DateTimeField(default=timezone.now)
    updated = models.DateTimeField(default=timezone.now)

    def update(self, *args, **kwargs):
        kwargs.update({'updated': timezone.now})
        super().update(*args, **kwargs)

        return self