Наследование от models.User: как избежать ситуации, когда пользовательские данные хранятся в 2 таблицах в базе данных? - PullRequest
0 голосов
/ 09 июня 2011

Ситуация такова: нам нужен модельный класс, хранящий данные профиля пользователя (его профессия, страна, регион, город и т. Д.).

Согласно официальной документации Django, мы должны сделать что-то вроде следующего:

...
class MyUser( models.User ):
  profession = models.CharField( max_length = 64 )
  # other fields...
...

Проблема в том, что в результате выполнения команды django-admin.py syncdb в базе данных есть 2 таблицы. Так что если мы хотим найти пользователя по профессии, то наш поиск не так эффективен! Мы могли бы искать, используя только одну таблицу, но мы должны искать, используя two !

Я знаю одно не очень чистое решение, когда в базе данных будет создана только одна таблица после syncdb : вместо использования унаследованных от models.User класс, который мы можем сделать следующим, чтобы расширить существующий Пользователь класс :

# utils.py
class Utils:

    class ClassContributor: 

        @staticmethod
        def contribute_fields( object_class, *fields ):
            for val in fields:                      
                field_name = val[ 0 ]
                field = val[ 1 ]
                field.contribute_to_class( object_class, field_name )

# models py
user_contributor = Utils.ClassContributor.contribute_fields(    
    User, 
    ( 'profession', models.CharField( max_lenght = 64 ) ),
)

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

Кто-нибудь знает другое решение проблемы 2-table ? Спасибо.

1 Ответ

1 голос
/ 09 июня 2011

В соответствии с рекомендациями в документах вы можете использовать «профиль пользователя» для хранения дополнительной информации о пользователях:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)

    profession = models.CharField( max_length = 64 )
    # other fields...

Вы можете получить к нему доступ user.get_profile().profession. Вы по-прежнему получаете две таблицы, но это рекомендуемый способ Django. Если вы ищете только атрибуты профиля, вы ищете только одну таблицу.

В сторону: действительно ли этот поиск настолько дорог в вашем специальном случае? Вы профилировали это? Для меня подход с двумя таблицами всегда был в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...