ForeignKey не допускает нулевые значения

Я использую Django REST Framework 2.0.

Вот мой модельный класс:

class Mission(models.Model):
    assigned_to = models.ForeignKey('auth.User',
                                    related_name='missions_assigned',
                                    blank = True)

Вот мой класс:

class MissionList(generics.ListCreateAPIView):
    model = Mission
    serialize_class = MissionSerializer
  1. Мультисекционная форма отображаются в браузере с пустым выбором для assigned_to области.

  2. При публикации raw JSON появляется следующее сообщение об ошибке:

Cannot assign None: "Mission.assigned_to" does not allow null values.

Ответ 1

blank опция используется в валидации формы, а null используется при записи в базу данных.

Таким образом, вы можете добавить null=True в это поле.

EDIT: продолжить комментарий

Рассмотрение двух шагов при сохранении объекта:

  1. Валидатор (управляемый blank)
  2. Ограничение базы данных (контролируемое null)

Для опции по default возьмите IntegerField например,
default=5, blank=True, null=False, pass (1), даже если вы не присвоили значение (имеющее blank=True), pass (2), потому что оно имеет значение по умолчанию (5) и записывает 5 вместо None для БД.
blank=True, null=False, которые проходят (1), но не (2), поскольку он пытается записать None в DB.

Таким образом, если вы хотите сделать поле необязательным, используйте либо default=SOMETHING, blank=True, null=False либо blank=True, null=True.

Другим исключением является строковое поле, такое как CharField.
Он предположил, что использовать blank=True одиночку, оставив null=False позади.
Это делает поле строкой (> = 1 char (s)) или пустую строку ('', с len() == 0) и никогда None.

Причина в том, что когда установлено значение null=True, будет существовать два возможных значения для состояния "unset": пустая строка и None, что запутывает (и может вызывать ошибки).

Ответ 2

ForeignKey допускает нулевые значения, если это поведение было установлено. Ваш код будет выглядеть так:

class Mission(models.Model):
    assigned_to = models.ForeignKey(
        'auth.User',
        related_name='missions_assigned',
        blank=True,
        null=True
    )

Вы должны написать null=True.

Примечание: после изменения модели вам нужно запустить python manage.py makemigrations yourappname а затем python manage.py migrate