在以下django模型中:
class MyModel(models.Model):
published = models.BooleanField(default=False)
pub_date = models.DateTimeField('date published')
我希望每次发布的字段更改为True时,都会使用当前日期自动更新pub_date字段。
智能方式是什么?
感谢。
答案 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