Вопрос

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

Платформа Djangos использует метаклассы для инициализации таблиц.Это означает, что вы не можете вносить исправления в новые столбцы, если вы также не повторно инициализируете класс, что, я не уверен, вообще возможно.(Это может быть).

Видишь Разница между возвращением измененного класса и использованием type() для получения дополнительной информации.

Я предполагаю, что вы можете столкнуться с проблемами относительно того, где определен ваш monkeypatch.Я предполагаю, что django syncdb создает таблицы базы данных только из "чистого" приложения аутентификации, поэтому ваша модель тогда будет без "местоположения", и тогда ваш сайт с исправлением будет искать это поле.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top