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

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

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

Пример:

Требуемая алфавитно-постоянная часть: ITM

Желаемая числовая автоинкрементная часть: 00000

Чтобы каждый объект моей модели при генерировании получал прогрессивные значения по умолчанию, такие как: ITM00001, ITM00002 , ITM00003, ...

Я бы хотел изменить значение поля из моего раздела администратора, например: ABC0000001, DFG0051, RST034, ...

Максимальная длина поля: 10 ( Это может быть и выше)

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

class my_model(models.Model):

    Field_1 = models.CharField(max_length=10, blank=True, null=True)
    static_ID = models.AutoField(???)

Ответы [ 3 ]

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

Вместо того, чтобы хранить его, почему бы не использовать метод свойства для генерации этого идентификатора? Например:

class MyModel(models.Model):

    field_one = models.CharField(max_length=10, blank=True, null=True)

    @property
    def static_id(self):
        'ITM{0:07d}'.format(self.pk)

Если вас интересует фильтрация, то вы можете использовать собственный метод менеджера:

class CustomManager(models.Manager):
    def get_id(self, static_id):
        return int(static_id[2:])
    def filter_static_id(self, static_id):
        _id = self.get_id(static_id)
        return self.filter(pk=_id)

  def filter_static_id(self, static_id):
        _id = self.get_id(static_id)
        return self.get(pk=_id)

 class MyModel(models.Model):
      objects = CustomManager()
1 голос
/ 07 февраля 2020

Возможно, вы можете разделить свое поле на три отдельных поля:

class MyModel(models.Model):
    PREF = "ITM"
    NUMS = 5

    field1 = models.CharField(max_length=10, blank=True, null=True)
    ...
    pref = models.CharField(max_length=3, default=PREF)  # prefix that has defaul value and can be modified
    nums = models.PositiveIntegerField(default=NUMS)  # the number of digits
    static_id = models.AutoField(primary_key=False)  # auto increment field

    class Meta:
        unique_together = ('pref', 'nums', 'static_id')

    @property
    def static_key(self):
        return self.pref + str(self.static_id).zfill(self.nums)
0 голосов
/ 28 февраля 2020

решено:

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

In models.py :

import time

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


class my_model(models.Model):        
    Field_1 = models.CharField(max_length=256)
    static_ID = models.CharField(max_length=256, blank=False, null=False, default=return_timestamped_id)
...