Django DateTimeField和datetime.datetime.now()提供不同的时间

时间:2019-12-01 14:41:33

标签: python django

我有一个模型,我希望name字段是时间戳的字符串表示形式,另一个字段是实际时间戳。这是我的模型代码:

from django.db import models
from datetime import datetime

class Image(models.Model):
    name = models.CharField(max_length=255, default=datetime.now().strftime("%Y%m%d-%H%M%S"))
    create_date = models.DateTimeField(auto_now_add=True)
    image = models.ImageField(upload_to="images/")

然后我进入Django shell,然后输入以下内容:

>>> import models
>>> models.Image(image='images/rock.png').save()

这可行,但唯一的问题是两次未对齐。例如,我得到name = 20191201-143119create_date = 2019-12-01 14:32:11.445474

如何使这两个日期时间相同?

2 个答案:

答案 0 :(得分:1)

我已经链接了answer,可以帮助您了解正在发生的事情。不过,实现您想要的东西很简单。

models.py

from django.db import models
from datetime import datetime

class Image(models.Model):
    name = models.CharField(max_length=255)
    create_date = models.DateTimeField(auto_now_add=True)
    image = models.ImageField(upload_to="images/")

    def save(self, *args, **kwargs):
        if not self.name: 
            self.name = datetime.now().strftime("%Y%m%d-%H%M%S")
        super(Image, self).save(*args, **kwargs) 

答案 1 :(得分:1)

这是Django世界中很常见的陷阱。 @ eliakin-costa提到的帖子讨论了此问题,尽管我不建议重写save方法来获得此行为,因为创建函数更容易(保持解耦和显式):

from django.db import models
from django.utils import timezone

def default_image_name():
   return timezone.now().strftime("%Y%m%d-%H%M%S")

class Image(models.Model):
    name = models.CharField(max_length=255, default=default_image_name)
    create_date = models.DateTimeField(auto_now_add=True)
    image = models.ImageField(upload_to="images/")

顺便问一下,您是否看过这个docsupload_to也接受可通话对象)?表格中是否确实需要一个name列?