Проблема с исправлением Django и monkey
-
22-09-2019 - |
Вопрос
Недавно я начал экспериментировать с Django для некоторых веб-приложений в свободное время.Разрабатывая модель данных для one, я столкнулся с дилеммой : использовать наследование для определения пользователя веб-сайта или использовать технику, известную как monkey patching, с пользовательским классом, уже предоставленным фреймворком.
Я попытался добавить поле с помощью (после определения всех моих моделей и т.д.без ошибок, согласно python manage.py validate
):
User.add_to_class('location', models.CharField(max_length=250,blank=True))
и выполнил syncdb
команда.Тем не менее, я продолжаю получать эту ошибку
Операционная ошибка:нет такой колонки:auth_user.местоположение
нахожусь ли я в режиме администратора сайта или в оболочке manage.py .Должен быть дополнительный шаг, которого мне не хватает, но, похоже, документация по всей технике исправления monkey ограничена.Поэтому я прошу вас о помощи, прежде чем я прибегну к наследованию.Любой код, советы или указатели на дополнительную документацию, конечно, приветствуются.
Заранее благодарю.
PS.Я знаю, что этот метод уродлив и, вероятно, опрометчив.;)
Решение
Когда вы добавляете поле в любую модель, даже если вы делаете это "официальным" способом, вам необходимо перенести базу данных - Django не делает этого за вас.Бросайте стол и бегите ./manage.py syncdb
снова.
Возможно, вы захотите изучить одну из платформ миграции, например south
, который будет управлять подобными вещами за вас.
Другие советы
Существует альтернатива обоим подходам, которая заключается в простом использовании связанная модель профиля.Это также хорошо документированный, настоятельно рекомендуемый подход.Возможно, причина, по которой подход add_to_class недостаточно хорошо документирован, как вы отметили, заключается в том, что он явно обескураженный (по уважительной причине).
Вот такой (немного более старый) способ расширения User
Модель.
Вот что должны сказать документы.
И вот такой недавний разговор о django-пользователи по поводу темы.
Платформа Djangos использует метаклассы для инициализации таблиц.Это означает, что вы не можете вносить исправления в новые столбцы, если вы также не повторно инициализируете класс, что, я не уверен, вообще возможно.(Это может быть).
Видишь Разница между возвращением измененного класса и использованием type() для получения дополнительной информации.
Я предполагаю, что вы можете столкнуться с проблемами относительно того, где определен ваш monkeypatch.Я предполагаю, что django syncdb создает таблицы базы данных только из "чистого" приложения аутентификации, поэтому ваша модель тогда будет без "местоположения", и тогда ваш сайт с исправлением будет искать это поле.
Вероятно, описан менее болезненный способ добавления дополнительной информации в профили пользователей в документах Django.