Django генерирует пользовательский идентификатор - PullRequest
0 голосов
/ 29 августа 2018

Я видел этот ответ , но конкретного ответа пока нет. Я хочу создать пользовательский id, который начинается с буквы. Когда в базу данных поступает новая запись, я хочу изменить id на A00001, .... A00002, .... A00010, ... A10000 и т. Д. id всегда будет в диапазоне 99999- 00001, так как могу ли я сделать это?

моя модель проста:

class Custom(models.Model):
    id = models.AutoField(primary_key=True, editable=False)

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Поле AutoField является видом поля IntegerField, поэтому вы не можете использовать PK как A00001.

Таким образом, возможный способ выполнить требование - изменить AutoField на CharField.

Технически, вы можете использовать "String PK Field" Но вы должны знать о проблемах / проблемах производительности, если вы используете это.

Здесь я нашел один хороший пост SO, который объясняет то же самое - Строки в качестве первичных ключей в базе данных SQL

=================== ================================================== ===

Если вы все еще действительно хотите перейти на String PKs , прочитайте следующее

Сначала вам нужно использовать CharField вместо AutoField и переопределить save() метод модели

<b>from django.db.models import Max</b>


class Custom(models.Model):
    id = models.<b>CharField</b>(primary_key=True, editable=False, max_length=10)
    name = models.CharField(max_length=100)

    <b>def save(self, **kwargs):
        if not self.id:
            max = Custom.objects.aggregate(id_max=Max('id'))['id_max']
            self.id = "{}{:05d}".format('A', max if max is not None else 1)
        super().save(*kwargs)</b>
0 голосов
/ 13 ноября 2018

У меня также есть другой способ, который я использую в своем проекте django. Вот код

def ids():
no = Employee.objects.count()
if no == None:
    return 1
else:
    return no + 1
emp_id = models.IntegerField(('Code'), default=ids, unique=True, editable=False)


id = models.CharField(primary_key=True, editable=False, max_length=30)
def save(self, **kwargs):
    if not self.id:
        self.id = "{}{:08d}".format('ABC', self.emp_id)
    super().save(*kwargs)
0 голосов
/ 29 августа 2018

строка в качестве первичного ключа не очень хорошая идея, если вы планируете делать ссылки на таблицу, поэтому я рекомендую вам добавить свойство, например:

class Custom(models.Model):
    id = models.AutoField(primary_key=True, editable=False)

    @property
    def sid(self):
        return "A%05d" % self.id

и для выполнения запросов вы можете выполнить обработку входных значений, например:

s_input = "A%05d" % 231 # 'A00231'
number = s_input[1:] # '00231'
input_id = int(number) # 231
...