Есть ли способ установить IntegerField модели Django по умолчанию на ID вновь созданной записи?
Допустим, у нас есть следующая модель:
class MyModel(models.Model):
some_int = models.IntegerField()
Я бы хотел, чтобы значение MyModel.some_int
по умолчанию соответствовало значению MyModel.id
.
Например, сразу после создания новой записи в пустой версии MyModel я могу вызвать MyModel.objects.get(id=1)
и получить объект с id=1 и some_int=1. Есть ли способ сделать это?
Edit: Мой текущий обходной путь - установить значение по умолчанию 0, затем вернуться и заполнить значение id
созданной записи, но это грязно.
Для контекста: В существующей модели, похожей на MyModel
, меня просят добавить новый столбец, который сделает использование индекса MyModel
устаревшим в качестве точки отсчета для записей в этой модели. Вместо этого я добавляю новый, вторичный столбец, который должен хранить значения старых идентификаторов для предыдущих записей и новые значения для будущих записей. Однако для этого мне нужно сначала заполнить столбец
Короче говоря, ознакомьтесь с сигналами после сохранения. Также ознакомьтесь с общим руководством по сигналам , если вы не использовали их раньше. В качестве альтернативы, перегрузите метод save()
..
Чтобы немного уточнить, Django допускает использование вызываемой переменной в качестве default
для IntegerField.
Однако, поскольку поля определяются как переменные класса, а не переменные экземпляра, вы не можете получить доступ к self
и, соответственно, self.id
напрямую.
Поэтому вы могли бы получить следующее id
внутри такой вызываемой переменной, используя любой из множества методов (это был бы другой вопрос, на который уже несколько раз отвечали на SO), и установить ваше значение в это значение... но за это время, между чтением этого значения и инстанцированием вашего MyModel
, когда ему действительно присваивается id
, другой MyModel
мог быть создан и "украсть" этот id
, и теперь у вас есть строка с неправильным полем some_int
, которое не соответствует его id
.
В зависимости от вашего случая использования, это может не вызывать беспокойства.
В целом, для любого случая использования я не верю, что может существовать одношаговое решение. Установка значения после создания, когда ему присвоено id
- единственное решение, хотя оно и "грязное". Единственный вопрос - есть ли в Django что-то встроенное для более четкого присвоения значения после создания, роль, которую должны выполнять либо перегрузка save()
, либо использование сигналов.