Как получить 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, чтобы определить, была ли модель уже создана.