Python django中的时间戳字段

Python django中的时间戳字段,python,mysql,django,Python,Mysql,Django,我有一个MySQL数据库,现在我将所有的datetime字段生成为models.DateTimeField。是否有办法获得时间戳?我想能够自动更新的创建和更新等 关于django的文档中没有这一点?实际上有一篇关于这一点的非常好且内容丰富的文章。在这里: 页面上的解决方案有点不推荐,因此我做了以下操作: from django.db import models from datetime import datetime from time import strftime class Unix

我有一个MySQL数据库,现在我将所有的datetime字段生成为
models.DateTimeField
。是否有办法获得
时间戳
?我想能够自动更新的创建和更新等


关于django的文档中没有这一点?

实际上有一篇关于这一点的非常好且内容丰富的文章。在这里:

页面上的解决方案有点不推荐,因此我做了以下操作:

from django.db import models
from datetime import datetime
from time import strftime

class UnixTimestampField(models.DateTimeField):
    """UnixTimestampField: creates a DateTimeField that is represented on the
    database as a TIMESTAMP field rather than the usual DATETIME field.
    """
    def __init__(self, null=False, blank=False, **kwargs):
        super(UnixTimestampField, self).__init__(**kwargs)
        # default for TIMESTAMP is NOT NULL unlike most fields, so we have to
        # cheat a little:
        self.blank, self.isnull = blank, null
        self.null = True # To prevent the framework from shoving in "not null".

    def db_type(self, connection):
        typ=['TIMESTAMP']
        # See above!
        if self.isnull:
            typ += ['NULL']
        if self.auto_created:
            typ += ['default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP']
        return ' '.join(typ)

    def to_python(self, value):
        if isinstance(value, int):
            return datetime.fromtimestamp(value)
        else:
            return models.DateTimeField.to_python(self, value)

    def get_db_prep_value(self, value, connection, prepared=False):
        if value==None:
            return None
        # Use '%Y%m%d%H%M%S' for MySQL < 4.1
        return strftime('%Y-%m-%d %H:%M:%S',value.timetuple())
来自django.db导入模型的

从日期时间导入日期时间
从时间导入strftime
类UnixTimestampField(models.DateTimeField):
“”“UnixTimestampField:创建在
数据库作为时间戳字段而不是通常的日期时间字段。
"""
定义初始化(self,null=False,blank=False,**kwargs):
超级(UnixTimestampField,self)。\uuuuu初始值(**kwargs)
#与大多数字段不同,TIMESTAMP的默认值不是NULL,因此我们必须
#欺骗一点:
self.blank,self.isnull=空白,null
self.null=True#防止框架挤入“notnull”。
def db_类型(自连接):
类型=['TIMESTAMP']
#看上面!
如果self.isnull:
类型+=['NULL']
如果创建了self.auto_:
typ+=[“更新当前时间戳时的默认当前时间戳”]
返回“”。加入(典型)
定义到python(自身,值):
如果isinstance(值,int):
return datetime.fromtimestamp(值)
其他:
返回models.DateTimeField.to_python(self,value)
def get_db_prep_值(self、value、connection、prepared=False):
如果值==无:
一无所获
#对MySQL<4.1使用“%Y%m%d%H%m%S”
返回strftime(“%Y-%m-%d%H:%m:%S”,value.timetuple())
要使用它,您只需执行以下操作:
timestamp=UnixTimestampField(auto_created=True)

在MySQL中,列应显示为:
“timestamp”timestamp NOT NULL更新当前时间戳时的默认当前时间戳,


唯一的缺点是它只在MySQL数据库上工作。但是您可以轻松地为其他人修改它。

pip包django unixdatetimefield提供了一个unixdatetimefield字段,您可以使用该字段进行开箱即用()

示例模型:

from django_unixdatetimefield import UnixDateTimeField

class MyModel(models.Model):
    created_at = UnixDateTimeField()
Python ORM查询:

>>> m = MyModel()
>>> m.created_at = datetime.datetime(2015, 2, 21, 19, 38, 32, 209148)
>>> m.save()
数据库:

sqlite> select created_at from mymodel;
1426967129
如果有兴趣,这里是源代码-


免责声明:我是此pip软件包的作者。

要在插入和更新时自动更新,请使用以下命令:

created = DateTimeField(auto_now_add=True, editable=False, null=False, blank=False)
last_modified = DateTimeField(auto_now=True, editable=False, null=False, blank=False)
DateTimeField应该存储UTC(检查您的DB设置,我从Postgres知道情况就是这样)。您可以通过以下方式在模板和格式中使用
l10n

{{ object.created|date:'SHORT_DATETIME_FORMAT' }}
自Unix纪元起的秒数:

{{ object.created|date:'U' }}

请参见有一个有用的
时间戳模型

函数的
get\u db\u prep\u value
已过时,因为它只适用于MySQL<4.1上的
时间戳
列。对于MySQL的现代版本,请使用
'%Y-%m-%d%H:%m:%S'
而不是
'%Y%m%d%H%m%S'
。对于django 1.8,您应该实现from\u db\u value来将数据库值转换为对象的属性。它是否具有NULL等选项?它是django中标准DateTimeField的子类,这反过来又支持NULL等。请参阅代码行8 at-我正在尝试从Django Rest Framework插入数据,当我发送有效负载:{“timeStamp”:1581950810时,我得到以下错误:{“timeStamp”:[“Datetime的格式错误。请改用其中一种格式:YYYY-MM-DDThh:MM[:ss[.uuuuuuuuuuuuu][+HH:MM |-HH:MM | Z]}可以接受字段上的时间戳吗?你用错了。如果需要向API发送unix时间戳,则应使用Django Rest框架来处理它,而无需使用此库。