Как получить pk объекта в виде целого числа?

У меня эта модель:

class Class(models.Model):
    class_id = models.IntegerField(blank=False)

    def save(self, *args, **kwargs):
        self.class_id = self.pk+1000
        super(Class, self).save(*args, **kwargs)

Как вы видите, я хочу, чтобы pk было добавлено к 1000 и использовалось как значение class_id. Но я получаю эту ошибку:

TypeError at /new-class

unsupported operand type(s) for +: 'NoneType' and 'int'

Как я могу иметь pk в виде целого числа?

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

В любом случае, зачем хранить это значение в базе данных, если оно всегда будет id + 1000. Вместо этого можно использовать свойство.

class Class(models.Model):

    @property
    def class_id(self):
        return self.pk and self.pk + 1000

Если вы хотите использовать свой оригинальный подход, вы должны изменить метод сохранения.

def save(self, *args, **kwargs):
    if self._state.adding:
        # save once to get a id
        super().save(*args, **kwargs)
    self.class_id = self.pk + 1000
    super().save(*args, **kwargs)

pk is целое число, но оно устанавливается только после создания модели, поскольку берется из последовательности в базе данных.

Вы также можете использовать булево значение self._state.adding, чтобы определить, была ли модель уже создана.

Вернуться на верх