如何在Django admin的字段中将时间戳生成为默认值

时间:2018-10-09 10:20:33

标签: django django-models django-admin

我有一个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或重新加载服务器,它会更改,但是当我再次在浏览器中重新加载管理页面时,它不会更改

1 个答案:

答案 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来“丢失类型约束”。