所有DateTimeField都在Django中冻结

时间:2015-12-25 17:33:48

标签: python django

我有一个基于社区/论坛的网站我在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本身的错误?

1 个答案:

答案 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; 解决了他的问题,但希望它不会让其他人感到困惑。