Таким образом, проблема, с которой вы столкнетесь, заключается в том, что все, что вы хотите для своего профиля, нужно сохранить в какой-то базе данных.В основном все серверные части для django являются реляционными, и, таким образом, каждое поле в постоянном объекте присутствует в каждой строке таблицы.Есть несколько способов получить то, что вы хотите.
Django обеспечивает некоторую поддержку наследования * 1003. * Вы можете использовать перечисленные приемы и получать разумные результаты полиморфным способом.
Самый прямой подход - использовать наследование нескольких таблиц,Примерно:
class UserProfile(models.Model):
# set settings.AUTH_PROFILE_MODULE to this class!
pass
class UserProfileA(UserProfile):
pass
class UserProfileB(UserProfile):
pass
Чтобы использовать его:
try:
profile = user.get_profile().userprofilea
# user profile is UserProfileA
except UserProfileA.DoesNotExist:
# user profile wasn't UserProfileB
pass
try:
profile = user.get_profile().userprofileb
# user profile is UserProfileB
except UserProfileB.DoesNotExist:
# user profile wasn't either a or b...
Редактировать: Re, ваш комментарий.
Реляционная модель подразумевает рядвещи, которые кажутся несогласными с объектно-ориентированной философией.Чтобы отношение было полезным, требуется, чтобы каждый элемент отношения имел одинаковые измерения, так что реляционные запросы действительны для всего отношения.Поскольку это известно априори, перед тем как встретить экземпляр класса, хранящийся в отношении, строка не может быть подклассом.Orm django преодолевает это несоответствие импеданса, сохраняя информацию подкласса в другом отношении (одно специфическое для подкласса). Существуют другие решения, но все они подчиняются этой основной природе реляционной модели.
Если это поможет вам с этим смириться, я бы посоветовал посмотреть, как постоянство в RDBM работает для приложений в отсутствие ORM.В частности, реляционные базы данных больше относятся к коллекциям и сводкам многих строк, чем к применению поведения к данным, извлеченным из базы данных.
Конкретный пример использования функции профиля django.contrib.auth
является довольно неинтересным, особенно если единственный способ, которым когда-либо используется эта модель, - это выборка данных профиля, связанных с конкретным экземпляром django.contrib.auth.models.User
.Если других запросов нет, вам вообще не нужен подкласс django.models.Model
.Вы можете выбрать обычный класс Python и сохранить его в поле BLOB-объекта другой безликой модели.
С другой стороны, если вы хотите делать более интересные вещи с профилями, например, поиск пользователей, которые живут вдля определенного города, тогда для всех профилей будет важно иметь индекс для своей городской собственности.Это не имеет ничего общего с ООП, и все, что связано с реляционными.