Как установить значение по умолчанию при добавлении поля в модель?
Я добавил поле user
, которое является внешним ключом к другой модели под названием User
. Это поле было добавлено в модель под названием Bid
. Однако, когда я попытался перенести изменения, я получил сообщение:
It is impossible to add a non-nullable field 'user' to bid without specifying a default. This is because the database needs something to populate existing rows. Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit and manually define a default value in models.py.
В прошлый раз я установил значение 'user'
и получил ошибку, которая гласила: ValueError: invalid literal for int() with base 10: 'user'
.
Какое значение я должен установить по умолчанию?
models.py:
class Bid(models.Model):
item = models.ForeignKey(Listing, on_delete=models.CASCADE)
price = models.FloatField()
user = models.ForeignKey(User, on_delete=models.CASCADE)
Как следует из ошибки, вы создаете новое поле в таблице. При создании нового поля необходимо учитывать существующие строки. Самый безопасный подход - установить его как null=True
и обработать поле позже.
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
Однако вы можете не захотеть, чтобы у Bid
был нулевой пользователь. В этом случае я рекомендую изучить как написать пользовательскую миграцию для заполнения существующих строк.
Другое замечание: если данные, которые есть в вашей таблице, не нужны, вы можете рассмотреть возможность удаления таблицы и ее восстановления или удаления ваших миграций и создания их снова с помощью manage.py makemigrations
- опять же, только если данные, которые есть в вашей базе данных, не нужны.
Если вы добавляете связь через новый внешний ключ, у вас есть два варианта
- Вы делаете новый FK nullable и позволяете ему по умолчанию иметь значение
NULL
(т.е.None
в python). Таким образом, унаследованные записи с неизвестными отношениями будут иметьNULL
в качестве FK, т.е. не будут знать своих пользователей. - Вы вручную заполняете унаследованные поля соответствующими внешними ключами к записям
Bid
. Это требует, чтобы вы сохранили эту информацию заранее.