我有一个CharField,默认情况下,我希望将纪元时间作为唯一数字。
class Shakf(models.Model):
name = models.CharField(max_length=255, default='', null=True)
id_num = models.CharField(max_length=50, default=str(int(time.time())), unique=True)
当我重新加载页面时,我得到相同的纪元时间。然后我尝试将str(int(time.time()))放入函数中。...像这样:
def epoch_time():
return str(int(time.time()))
class Shakf(models.Model):
name = models.CharField(max_length=255, default='', null=True)
id_num = models.CharField(max_length=50, default=epoch_time(), unique=True)
但是我得到相同的结果。当我重新加载页面时,id_num字段中的默认值相同。 实际上,如果我编辑model.py或重新加载服务器,它会更改,但是当我再次在浏览器中重新加载管理页面时,它不会更改
答案 0 :(得分:3)
您在此处已将一个值指定为default
。实际上,Python首先会评估操作数。因此CharField
不知道是什么表达式生成了默认值。
不过,您可以指定可调用对象,例如:
def default_id_num():
return str(int(time.time()))
class Shakf(models.Model):
name = models.CharField(max_length=255, default='', null=True)
id_num = models.CharField(max_length=50, default=default_id_num, unique=True)
请注意,我们不调用default_id_num
函数,我们将其作为参考传递。
话虽如此,但是定义一个CharField
来存储它是“奇怪的”。您可以添加带有DateTimeField
的时间戳,并将其设置在auto_now_add
上:
# more elegant approach
class Shakf(models.Model):
name = models.CharField(max_length=255, default='', null=True)
timestamp = models.DateTimeField(auto_now_add=True)
否则,至少要使用IntegerField
,因为现在您通过将其指定为CharField
来“丢失类型约束”。