Поле модели Django default
callable на самом деле не может быть методом экземпляра. Из-за того, как этот вызываемый объект используется в миграциях, он должен быть сериализуемым для миграций, например, в миграциях вы увидите ссылку на путь к функции, например default="my_app.models.my_callable_default"
.
То, как я видел другие решения, - это переопределить метод моделей save
, чтобы проверить эти поля и установить там значение по умолчанию.
class NewTest(models.Model):
score = models.IntegerField(default=0)
last_score = models.IntegerField(default=0)
def save(self, *args, **kwargs):
if not self.pk: # Check for create
self.last_score = self.score
else:
# Get the existing score from the database, because this instance has been modified
score_from_db = NewTest.objects.values("score").get(pk=self.pk)["score"]
self.last_score = self.score
return super().save(*args, **kwargs) # Continue with save as normal
Это решение переопределяет метод save
вашей модели, чтобы назначить другое значение поля для поля last_score
во время создания, и если это обновление, оно извлечет существующий объект из базы данных, чтобы получить последний результат (I ' Я не уверен, что это то, что вам нужно). if not self.pk
используется для проверки, вызывается ли текущее сохранение для нового объекта (создание) или существующего объекта (обновление), потому что база данных назначает первичный ключ во время создания.