Django:时间戳字符串自定义字段

时间:2009-06-12 00:17:49

标签: python django django-models

我正在尝试创建自定义时间戳字段。

class TimestampKey(models.CharField):
    __metaclass__ = models.SubfieldBase

    def __init__(self, *args, **kwargs):
        import time

        kwargs['unique'] = True
        kwargs['max_length'] = 20
        kwargs['auto_created'] = True
        kwargs['editable']=False
        super(TimestampKey, self).__init__(*args, **kwargs)

    def to_python(self, value) :
        return value

    def get_db_prep_value(self, value) :
        try:
            import time
            t = time.localtime()
            value = reduce(lambda a,b:str(a)+str(b),t)
        except ValueError:
            value = {}

        return value


class Table1(models.Model):
       f = TimestampKey(primary_key=True)
       n = ....

它在db中存储具有适当时间戳的值。但它并没有填充对象中的字段'f'。

例如:

t1 = Table1(n="some value")
t1.f -> blank

t1.save()

t1.f -> blank. 

这就是问题所在。我错过了一些东西,以至于它没有填充该字段吗? 请详细说明一下。

感谢。

2 个答案:

答案 0 :(得分:3)

使用时间戳作为主键是明智的吗?如果您的数据库使用的是ISO 8601,或者实际上是任何时间格式,其中第二个是最小的时间间隔......好吧,无论如何,我的观点是您无法保证,特别是如果这将是一个面向Web的应用程序,即两个条目将在最短时间间隔内解决。也就是说,如果最小时间间隔是秒,如ISO 8601中所示,如果在同一秒内收到两个保存请求,则会出现错误情况。为什么不坚持自动递增整数键,只是让时间戳成为自己的字段?

答案 1 :(得分:1)

get_db_prep_value方法只为数据库准备一个值,但不会以任何方式将准备好的值发送回Python对象。为此,我认为你需要pre_save方法。

幸运的是,DateField和DateTimeField上已经有一个“auto_now”选项可以使用pre_save执行您想要的操作。尝试:

class Table1(models.Model):
    f = models.DateTimeField(auto_now=True)

(如果您必须自己编写pre_save,请查看auto_now如何修改第486-492行/django/db/models/fields/__init__.py中的实际模型实例:

def pre_save(self, model_instance, add):
    if self.auto_now or (self.auto_now_add and add):
        value = datetime.datetime.now()
        setattr(model_instance, self.attname, value)
        return value
    else:
        return super(DateField, self).pre_save(model_instance, add)