Как объявить поле буквенно-цифрового идентификатора на основе времени с предопределенной частью c aplphabeti (модель Django) - PullRequest
0 голосов
/ 17 февраля 2020

Я занимаюсь разработкой приложения на Django.

Я хотел вставить в свою модель автоматически увеличивающееся буквенно-цифровое поле уникального идентификатора, имеющее по умолчанию фиксированную алфавитную часть и автоматически увеличивающееся числовое значение. часть. Но я также хочу, чтобы доступность менялась из административной части этого идентификатора в другой буквенно-цифровой, с другой буквенно-цифровой и числовой частью.

Я попытался реализовать это, но оказалось, что попытка реализовать такое поле и сделать его автоматическим полем модели вызывает проблемы в моей базе данных.

Итак Я меняю свою цель: теперь я хочу реализовать основанное на времени буквенно-цифровое уникальное поле с предопределенной частью aplphabeti c. Обратите внимание : я не хочу перезаписывать поле идентификатора по умолчанию django, я просто хочу включить в мою модель поле, которое получает в качестве значения по умолчанию уникальное индивидуальное буквенно-цифровое значение.

Вот что я сделал в своем файле models.py:

def return_timestamped_id():
    prefix = "ITCH"    
    import time
    this_time = time.time()
    this_time  = this_time  *10000000
    this_time  = int(this_time)
    timestamp = str(this_time)
    default_value = prefix + timestamp
    return(default_value)

class object_example(models.Model):
    name = models.CharField(max_length=256, blank=True, null=True)    
    Id_generated = models.CharField(max_length=256, blank=False, null=False, unique=True, default=return_timestamped_id())

Проблема заключается в том, что при добавлении объектов к этой модели из раздела администрирования Id_generated всегда одинаков.

Я ожидал, что функция return_timestamped_id() вызывается каждый раз, когда я добавляю новый объект. Понятно, что вместо этого вызывается только один раз, а затем то же возвращаемое значение передается в Id_generated каждого нового объекта.

Как я могу изменить свой код, чтобы каждый раз получать новую метку времени объект добавлен?

1 Ответ

1 голос
/ 17 февраля 2020

Как вы, вероятно, видели в Django документах , вы можете использовать либо значение, либо вызываемое по умолчанию. Если вы используете вызываемый объект (например, функцию), он будет вызываться каждый раз, когда требуется значение по умолчанию.

Проблема : вы передавали значение, потому что вызывали свою функцию default=return_timestamped_id(). Функция была вызвана один раз, когда ваш модуль (models.py) был импортирован в приложение.

Решение : передать саму функцию default=return_timestamped_id

Вы в классе django .models.Fields можно увидеть соответствующий код (мои комментарии):

class Field():
    def __init__(self, ..., default=NOT_PROVIDED,...):
        ...
        self.default = default  # save the default as a member variable
        ...

    def get_default(self):
        """Return the default value for this field."""
        return self._get_default()

    @cached_property
    def _get_default(self):
        if self.has_default():
            if callable(self.default):  # if it is callable, return it
                return self.default
            return lambda: self.default # else wrap in a callable
...