尝试将一些SqlAlchemy移植到Django并且我已经有了这个棘手的问题:
version = Column(
BIGINT,
default=literal_column(
'UNIX_TIMESTAMP() * 1000000 + MICROSECOND(CURRENT_TIMESTAMP)'
),
nullable=False)
将literal_column
位移植到Django的最佳选择是什么?我到目前为止最好的想法是设置为执行相同原始sql的默认设置的功能,但我不确定是否有更简单的方法?我的google-foo让我失望了。
编辑:我们需要使用mysql创建的时间戳的原因是我们正在测量某些东西是否过时(所以我们需要实际知道时间)我们想要,为了正确,只有一个时间标记权限(这样我们就不会使用查看系统时间的python函数引入错误,这可能会因服务器而异。)
目前我已经:
def get_current_timestamp(self):
cursor = connection.cursor()
cursor.execute("SELECT UNIX_TIMESTAMP() * 1000000 + MICROSECOND(CURRENT_TIMESTAMP)")
row = cursor.fetchone()
return row
version = models.BigIntegerField(default=get_current_timestamp)
在这一点上,听起来像是我最好/唯一的选择。
答案 0 :(得分:1)
如果您不关心拥有中央时间权限:
import time
version = models.BigIntegerField(
default = lambda: int(time.time()*1000000) )
将数据库弯曲到您的意愿:
from django.db.models.expressions import ExpressionNode
class NowInt(ExpressionNode):
""" Pass this in the same manner you would pass Count or F objects """
def __init__(self):
super(Now, self).__init__(None, None, False)
def evaluate(self, evaluator, qn, connection):
return '(UNIX_TIMESTAMP() * 1000000 + MICROSECOND(CURRENT_TIMESTAMP))', []
### Model
version = models.BigIntegerField(default=NowInt())
因为表达式节点不是callables,所以表达式将被评估数据库端。