Django相当于SqlAlchemy的literal_column

时间:2013-03-28 00:01:52

标签: mysql django django-models sqlalchemy

尝试将一些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)

在这一点上,听起来像是我最好/唯一的选择。

1 个答案:

答案 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,所以表达式将被评估数据库端。