Как сгенерировать метку времени в качестве значения по умолчанию в поле в Django admin - PullRequest
0 голосов
/ 09 октября 2018

У меня есть 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 голосов
/ 09 октября 2018

Вы указали здесь default a значение .Действительно, Python сначала оценивает операнды.Таким образом, CharField не не знает, какое выражение сгенерировало значение по умолчанию.

Однако вы можете указать вызываемый объект, например:

def <b>default_id_num</b>():
    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=<b>default_id_num</b>, unique=True)

Обратите внимание, что мы делаем not вызывает функцию 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.<b>DateTimeField(auto_now_add=True)</b>

Или, если это не вариант, по крайней мере, используйте IntegerField, так как теперь вы «теряете тип»ограничения ", указав его как CharField.

...