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自动执行主键。只有在有重要原因的情况下,才应该设置自己的主键。