Добавьте префикс к первичному ключу в django - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь добавить префикс (YNT) к первичному ключу в django модель

Models.py

class testmodel(models.Model):
    product_id = models.IntegerField(max_length=500, primary_key=True)
    product_short_code = models.CharField(max_length=500, default=0, null=True)

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

Я хочу, чтобы таблица выглядела так

product_id    product_short_code

YNT1000        PP001
YNT1001        PL023

Ответы [ 4 ]

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

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

class testmodel(models.Model):
    product_short_code = models.CharField(max_length=500, default=0, null=True)

    def product_id(self):
       return f'YNT{self.id}'
0 голосов
/ 07 января 2020

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

Тогда, если вам нужен другой, читаемый человеком идентификатор, вы всегда можете создать поле char product_id, которое будет так же просто, как 'YNT' + str(1000+id), который вы можете сохранить, используя сигнал post_save . Вы также можете добавить индекс к указанному полю, чтобы сделать запрос более быстрым, если это необходимо.

Пример:

@receiver(post_save, sender=Product)
def set_product_id(instance, created, **_kwargs):
    if created:
        instance.product_id = 'YNT' + str(1000 + instance.id)

Но, тем не менее, ваши отношения должны быть по умолчанию pk, а не по id.

0 голосов
/ 07 января 2020

Есть несколько подходов, которые вы должны использовать для достижения этой цели:

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

class testmodel(models.Model):
    product_code = models.IntegerField(db_index=True)
    product_short_code = models.CharField(max_length=500, default=0, null=True)

    @property
    def product_id(self):
        return f"YNT{self.product_code}"

2. Если префикс не является общим для всех записей, вы можете создать поле в вашей модели для хранения префикса и добавить префикс при получении значение.

class testmodel(models.Model):
    product_code = models.IntegerField(db_index=True)
    product_prefix = models.CharField(max_length=20, default='YNT')
    product_short_code = models.CharField(max_length=500, default=0, null=True)

    @property
    def product_id(self):
        return f"{self.product_prefix}{self.product_code}"

3. Если вы хотите создать CharField как primary_key, тогда вы

def create_id():
    // code for creating unique ids. assuming the id will be stored in _id variable.
    return f"YNT{_id}"

class testmodel(models.Model):
    product_id = models.CharField(primary_key=True, max_length=20, default=create_id)
    product_short_code = models.CharField(max_length=500, default=0, null=True)

При третьем подходе вы должны убедитесь, что первичный ключ всегда уникален.

0 голосов
/ 07 января 2020

Пожалуйста, измените IntegerField на CharField в классе тестовой модели.

class testmodel(models.Model):
    product_id = models.CharField(max_length=500, primary_key=True)
    product_short_code = models.CharField(max_length=500, default=0, null=True)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...