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

Python Django:时间戳字符串自定义字段,python,django,django-models,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_crea

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

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 = ....
它将带有适当时间戳的值存储在数据库中。但它不会填充对象中的字段“f”

例如:

这就是问题所在。我是不是漏掉了什么东西,以致无法填充该字段? 请解释一下


谢谢。

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

幸运的是,DateField和DateTimeField上已经有了一个“auto_now”选项,可以使用
pre_save
实现您想要的功能。尝试:

class Table1(models.Model):
    f = models.DateTimeField(auto_now=True)
(如果必须编写自己的
pre\u save
,请查看第486-492行的
auto\u now
如何修改
/django/db/models/fields/\uuuuu init\uuuuuuuuuuuuuuuuuuuuuupy
中的实际模型实例:

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)

)

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

幸运的是,DateField和DateTimeField上已经有了一个“auto_now”选项,可以使用
pre_save
实现您想要的功能。尝试:

class Table1(models.Model):
    f = models.DateTimeField(auto_now=True)
(如果必须编写自己的
pre\u save
,请查看第486-492行的
auto\u now
如何修改
/django/db/models/fields/\uuuuu init\uuuuuuuuuuuuuuuuuuuuuupy
中的实际模型实例:

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)

)使用时间戳作为主键是否明智?如果您的数据库使用ISO 8601或任何时间格式,其中秒是最小的时间间隔。。。不管怎样,我的观点是你不能保证,尤其是如果这是一个面向web的应用程序,两个条目将在最短的时间间隔内解析。也就是说,如果最小的时间间隔是一秒钟,如ISO 8601中所示,如果在同一秒钟内收到两个保存请求,则会出现错误情况。为什么不坚持自动递增整数键,只将时间戳设置为自己的字段?

使用时间戳作为主键是否明智?如果您的数据库使用ISO 8601或任何时间格式,其中秒是最小的时间间隔。。。不管怎样,我的观点是你不能保证,尤其是如果这是一个面向web的应用程序,两个条目将在最短的时间间隔内解析。也就是说,如果最小的时间间隔是一秒钟,如ISO 8601中所示,如果在同一秒钟内收到两个保存请求,则会出现错误情况。为什么不坚持自动递增整数键,只需将时间戳设置为自己的字段?

谢谢krubo。这确实帮助了我,谢谢克鲁博。这确实帮了我的忙。是的,如果我把它当作约会的话,你是对的()。但我计划将整个时间戳用作VARCHAR。如果查看代码,您可能会看到我将元组缩减为字符串。所以,这不应该是个问题。+1 Django自动执行主键。只有在有重要原因的情况下,你才应该设置自己的主键。是的,如果我将它用作日期,你是对的()。但我计划将整个时间戳用作VARCHAR。如果查看代码,您可能会看到我将元组缩减为字符串。所以,这不应该是个问题。+1 Django自动执行主键。只有在有重要原因的情况下,才应该设置自己的主键。