我有一个基于社区/论坛的网站我在Django工作,每当创建帖子或回复时我都会创建一个时间戳。但是,论坛帖子和回复的时间戳始终在2015年12月24日晚上9:28冻结。这是我的模特。
class ForumReply(models.Model):
by = models.ForeignKey(User)
reply_to = models.ForeignKey(ForumPost)
body = models.TextField()
created = models.DateTimeField(default=timezone.now)
points = models.PositiveSmallIntegerField(default=0)
def __str__(self):
return str(self.body[:10])
def __unicode__(self):
return unicode(self.body[:10])
def like_reply(self):
self.points = F('points') + 1
profile = User.userprofile.related.related_model.objects.filter(user=self.by)
profile.update(points=F('points') + 10)
self.save()
class ForumPost(models.Model):
subforum = models.ForeignKey(SubForum)
by = models.ForeignKey(User)
title = models.CharField(max_length=50)
name = models.CharField(max_length=50)
body = models.TextField()
created = models.DateTimeField(default=timezone.now)
points = models.IntegerField(default=0)
def __str__(self):
return str(self.title)
def __unicode__(self):
return unicode(self.title)
def like_post(self):
self.points = F('points') + 1
profile = User.userprofile.related.related_model.objects.filter(user=self.by)
profile.update(points=F('points') + 15)
self.save()
我的日期时间字段是否有问题导致它执行此操作?或者它是django本身的错误?
答案 0 :(得分:2)
因为您正在传递timezone.now
,这是一个函数对象。加载django时,它将仅在ONCE中进行评估,因为此时该值仅在重新初始化django后才会更改。您需要使用auto_now_add
:
created = models.DateTimeField(auto_now_add=True, blank=True)
请阅读django docs了解详情。
修改强>
我对第一部分(由@Daniel指出)实际上是错误的,在初始化django时不会调用timezone.now
,但timezone.now()
会调用timezone.now
。每次创建模型对象时都会调用auto_now_add
,该对象应具有所需的行为。我假设OP使用 create table `c_data` (
`Name` varchar(24) not null,
`c1` int(5) not null,
`c2` int(5) not null,
`c3` int(5) not null,
`c4` int(5) not null
);
insert c_data values
('Paulus', 50, 50, 0, 0),
('John', 0, 50, 0, 0),
('Anne', 0, 0, 50, 0),
('Chris', 0, 0, 0, 50);
select
name,
case greatest(c1, c2, c3, c4)
when c1 then concat('c1', ' (', c1, ')')
when c2 then concat('c2', ' (', c2, ')')
when c3 then concat('c3', ' (', c3, ')')
when c4 then concat('c4', ' (', c4, ')')
end as top_column
from c_data
order by name;
解决了他的问题,但希望它不会让其他人感到困惑。