В Django, как вы можете изменить класс User для работы с другой таблицей БД? - PullRequest
1 голос
/ 15 мая 2009

Мы работаем с django вместе и совместно используем базу данных с существующим приложением. И мы хотим использовать существующую «пользовательскую» таблицу (не собственную Django) для хранения пользовательской информации.

Похоже, можно изменить имя таблицы, которую использует Django, в мета-классе определения пользователя.

Но мы бы предпочли не менять само ядро ​​Django.

Итак, мы подумали, что могли бы создать подкласс базового класса auth.User, например:

class OurUser(User) :
    objects = UserManager()
    class Meta:
        db_table = u'our_user_table'

Здесь цель не состоит в том, чтобы добавлять какие-либо дополнительные поля в пользовательский класс пользователя. Но просто использовать альтернативную таблицу.

Однако это терпит неудачу (вероятно, потому что ORM предполагает, что our_user_table должен иметь внешний ключ, ссылающийся на исходную таблицу User, чего нет).

Итак, это разумный способ сделать то, что мы хотим сделать? Я упустил какой-то более простой способ отобразить классы на таблицы? Или, если нет, это можно заставить работать?

Обновление:

Я думаю, что я смогу внести необходимые изменения, просто "установив обезьяны" на _meta пользователя в local_settings.py

User._meta.db_table = 'our_user_table'

Может ли кто-нибудь придумать что-нибудь плохое, что может случиться, если я сделаю это? (Особенно в контексте довольно типичного приложения Django / Pinax?)

1 Ответ

6 голосов
/ 15 мая 2009

Может оказаться полезным установить старую таблицу в качестве альтернативного источника аутентификации и обойти все эти проблемы.

Другим вариантом является создание подкласса пользователя и указание подкласса для вашей пользовательской модели. Переопределите функцию сохранения, чтобы убедиться, что все, что вам нужно сделать, чтобы сохранить ваши старые функции, есть.

Я сам не делал ничего из этого, но надеюсь, что они полезные указатели.

Обновление Под альтернативной аутентификацией в данном случае я подразумеваю небольшой скрипт на python, который говорит: «Да, это действительное имя пользователя / пароль». Затем он создает экземпляр модели в стандартной таблице Django, копирует поля напротив старой таблицы и возвращает новый пользователь для звонящего.

Если вам нужно синхронизировать две таблицы, вы можете решить, чтобы альтернативная аутентификация никогда не создавала стандартного пользователя django и просто говорила «Да, это действительный пароль и имя пользователя»

...