Как я могу заполнить поле с идентификатором при сохранении, но идентификатор еще не существует - PullRequest
0 голосов
/ 28 мая 2019

Я создаю систему поддержки, и мне хотелось бы иметь автоматическое обозначение заявки на основании длины идентификатора.Пример: идентификатор билета 47, поэтому я хотел бы иметь 5-целое длинное обозначение -> # 00047 или если идентификатор 2021 должен быть # 02021

мой соответствующий код: Моя модель:

class Ticket(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    designation = models.CharField(max_length=255, blank=True, null=True)

Я попытался заполнить поля циклом for в моем views.py

 def Index(request):
    ticket = Ticket.objects.all()
    for t in ticket:
      id = len(str(t.id))
      if id == 1:
        t.designation = "#" + str("0000") + str(t.id)
      elif id == 2:
        t.designation = "#" + str("000") + str(t.id)
      elif id == 3:
        t.designation = "#" + str("00") + str(t.id)
      elif id == 4:
        t.designation = "#" + str("0") + str(t.id)
      else:
        t.designation = "#" + str(t.id)
    context = {'ticket':ticket}
    return render(request, 'ticketsystem/index.html', context)

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

Я попытался сделать следующее, добавив его в свою модель Ticket:

class Ticket(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    designation = models.CharField(max_length=255, blank=True, null=True)

    def save(self):
        id = len(str(id))
        if id == 1:
            designation = "#" + str("0000") + str(id)
        elif id == 2:
            designation = "#" + str("000") + str(id)
        elif id == 3:
            designation = "#" + str("00") + str(id)
        elif id == 4:
            designation = "#" + str("0") + str(id)
        else:
            designation = "#" + str(id)
        super().save()

, но возникла следующая ошибка:

локальная переменная 'id', на которую ссылается перед присваиванием

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Вам нужно выполнить вызов super перед всем остальным, иначе ваш объект не будет в БД.

class Ticket(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    designation = models.CharField(max_length=255, blank=True, null=True)

    def save(self):
        if not self.pk:
            super().save()

        str_id = str(self.pk)
        if str_id == 1:
            self.designation = "#0000{}".format(str_id)
        elif str_id == 2:
            self.designation = "#000{}".format(str_id)
        elif str_id == 3:
            self.designation = "#00{}".format(str_id)
        elif str_id == 4:
            self.designation = "#0{}".format(str_id)
        else:
            self.designation = "#{}".format(str_id)

        return self.save()
0 голосов
/ 28 мая 2019

Вы не перезаписали поле id, поэтому оно будет целым числом, и вы хотите, чтобы Django обрабатывал автоинкремент и т. Д.

Вам было бы лучше (на мой взгляд) просто добавитьновое поле, которое берет идентификатор и преобразует его в строку

class Ticket(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)

    @property
    def ticketkennung(self):
        this_id = str(self.id)
        if len(this_id) = 1 : str_id = '0000' + this_id
        etc ...
        return this_id

ИЛИ

class Ticket(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    designation = models.CharField(max_length=255, blank=True, null=True)

    def save(self):
        this_id = len(str(self.id))
        if id == 1: self.designation = "#" + str("0000") + str(id)
        etc
        super().save(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...