Как установить значение по умолчанию при добавлении поля в модель?

Я добавил поле 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 - опять же, только если данные, которые есть в вашей базе данных, не нужны.

Если вы добавляете связь через новый внешний ключ, у вас есть два варианта

  1. Вы делаете новый FK nullable и позволяете ему по умолчанию иметь значение NULL (т.е. None в python). Таким образом, унаследованные записи с неизвестными отношениями будут иметь NULL в качестве FK, т.е. не будут знать своих пользователей.
  2. Вы вручную заполняете унаследованные поля соответствующими внешними ключами к записям Bid. Это требует, чтобы вы сохранили эту информацию заранее.
Вернуться на верх