我正在尝试创建自定义时间戳字段。
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.
这就是问题所在。我错过了一些东西,以至于它没有填充该字段吗? 请详细说明一下。
感谢。
答案 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)
)