Уникальное ограничение электронной почты для django.contrib.auth.user

Я изменил модель django.contrib.auth.user, сделав идентификатор электронной почты уникальным. После чего я добавил миграцию данных, чтобы отразить то же самое:

  • python manage.py имя приложения для миграции данных уникальный_пароль. За ним следует python manage.py schemamigration appname --auto--> без изменений. Наконец, python manage.py переносит имя приложения.

  • Переход вперед на 0003_unique_password

  • имя приложения: 0037_unique_password.py

Теперь, когда я добавляю пользователя, чей адрес электронной почты не уникален, он выдает ошибку и не позволяет мне создать пользователя через админку django. Но когда я это делаю: >

  • оболочка python manage.py

  • из django.contrib.auth.models импортировать пользователя

  • user=User('cust1','123','[email protected]') Это создает объект пользователя, даже если '[email protected]' уже существует.

Как я могу добавить уникальное ограничение в django.contrib.auth.user.email для существующего проекта (с данными)?


person suprita shankar    schedule 10.01.2013    source источник


Ответы (1)


Проверки на уникальность происходят во время проверки модели в соответствии с проверкой модели документация. Вызов save() для модели не приводит к автоматической проверке модели. Приложение администратора будет вызывать проверку модели.

Ничто не мешает вам создать объект User в Python, такой как user=User('cust1','123','[email protected]'), а затем выполнить user.save(). Если есть проверки уникальности на уровне базы данных, вы, скорее всего, получите исключение на этом этапе. Если вы хотите проверить перед сохранением, вызовите is_valid() в экземпляре модели.

Если вы хотите, чтобы каждый User объект автоматически проверялся перед сохранением, используйте ссылку pre_save Сигнал Django для проверки модели перед продолжением сохранения.

person Austin Phillips    schedule 15.01.2013
comment
спасибо, Остин ... но если бы я мог сделать что-то еще на уровне db??!! - person suprita shankar; 23.01.2013
comment
Ваша миграция должна была добавить ограничения уровня БД. Означает ли ваш вопрос, что User('cust1','123','[email protected]').save() не создает исключение, когда [email protected] уже существует в базе данных? - person Austin Phillips; 24.01.2013
comment
да. он не создает исключения. он просто добавляет его в БД с этими значениями: | - person suprita shankar; 28.01.2013
comment
Интересный. Какой сервер БД вы используете? Соответствует ли вывод manage.py sqlall текущей структуре таблиц вашей базы данных? Вы должны увидеть ограничение UNIQUE в определениях вашей базы данных CREATE TABLE. - person Austin Phillips; 29.01.2013