django-使datetimefield接受Unix时间戳

w--*_*w-- 4 python django datetime unix-timestamp

我想使模型的DateTimefield接受Unix时间戳(以秒为单位)值。

我找到了,但是可接受的解决方案不起作用?
DataTimeField中的unixtimestamp输入

即我不明白如何添加'%s'作为输入格式,特别是当标准datetime字段的to_python()代码不包含任何用于处理unix时间戳的逻辑时,尤其如此。

如果有一项设置可以让我做得很好。
否则,我想我想要的是子类化DateTimeField,并在设置值时以某种方式自动将int转换为datetime对象。我想在保存之前执行此操作,而不是覆盖save(),因为在检索此字段的值时我希望保持一致。即,当我取出值时,无论实例是否已保存,我都不必担心我是否有日期时间对象或整数。

我查看了django.db.models.fields的来源,但对我来说并不明显。

Nik*_*as9 6

pip包django-unixdatetimefield提供了一个UnixDateTimeField字段,您可以立即使用该字段(https://pypi.python.org/pypi/django-unixdatetimefield/)。

示例模型:

from django_unixdatetimefield import UnixDateTimeField

class MyModel(models.Model):
    created_at = UnixDateTimeField()
Run Code Online (Sandbox Code Playgroud)

Python ORM查询:

>>> m = MyModel()
>>> m.created_at = datetime.datetime(2015, 2, 21, 19, 38, 32, 209148)
>>> m.save()
Run Code Online (Sandbox Code Playgroud)

数据库:

sqlite> select created_at from mymodel;
1426967129
Run Code Online (Sandbox Code Playgroud)

如果感兴趣的话,这里是源代码-https: //github.com/Niklas9/django-unixdatetimefield

免责声明:我是这个pip包的作者。


Ben*_*rut 3

默认情况下,Django 应该会使用 UNIX 时间戳作为 DateTimeField 的值。Django\xe2\x80\x99s 的内省功能确实很强大,但是却让事情变得不那么明显,尤其是在 Python 代码的上下文中。

\n\n

DateTimeField您可以通过子类化和覆盖来实现它pre_save

\n\n
from django.db import models\nfrom datetime import datetime\n\nfrom django.db.models.fields import DateTimeField\n\nclass UCDateTimeField(DateTimeField):\n\n    def pre_save(self, model_instance, add):\n        if self.auto_now or (self.auto_now_add and add):\n            value = datetime.datetime.now()\n            setattr(model_instance, self.attname, value)\n            return value\n        else:\n            value = getattr(model_instance, self.attname)\n            if not isinstance(value, datetime):\n                # assume that the value is a timestamp if it is not a datetime\n                value = datetime.fromtimestamp(int(value))\n                # an exception might be better than an assumption\n                setattr(model_instance, self.attname, value)\n            return super(UCDateTimeField, self).pre_save(model_instance, add)\n\n\nclass Event(models.Model):\n    date = UCDateTimeField()\n
Run Code Online (Sandbox Code Playgroud)\n