Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Создание модели User не означает, что автоматом создастся связанная модель Profile. Зато при обращении к get_profile() для вновь созданного юзера вылетит исключение — вот тут сомневаться не приходится.А я вот сомневался :-[
>>> posts = Post.objects.filter(user__pk=2).order_by('?')[:2]
>>> assert posts[0] != posts[1]
>>> assert posts[0].user == posts[1].user
>>> assert posts[0].user is posts[1].user
Traceback (most recent call last):
File "<console>", line 1, in <module>
AssertionErrorimya_polzovatelya. Или вообще убирайте, пусть будет аутентификация по имейлу. Единственное только, придётся собственные auth-быкенды писать.AutoOneToOne штука хорошая. Но нестандартная :) Обратно, всякие get_profile и AUTH_PROFILE_MODEL предусмотрены создателями джанги и даже вроде как ими рекомендуются. Наверное, поэтому многие, в особенности новички, предпочитают идти именно вторым путём: он описан в мануале и ничего не надо ставить. модель пользователя django-primate имеет следующие отличия от auth.User… В остальном же модель пользователя primate гуляет как утка, плавает как утка и крякает как утка ведёт себя очень похоже на джанговский первоисточник.

С одной стороны, неплохо было бы в примате пропатчить и тесты джанги, чтобы они хотя бы не ломались.патчить тесты не нужно ни в коем случае, ведь тесты отражают принятые соглашения. если новая реализация ломает тесты, это означает лишь одно — реализация написана с ошибками (не важно: намеренными или нет).
User без уникального индекса на email и с полями first_name и last_name. Тогда и тесты не сломаются.Логин/пароль и допустим сексуальная ориентация пользователя — это же совершенно разные данные, умоляю, почему они все должны храниться в одном объекте?Окей. А имя и фамилия где должны храниться — там же, где пароль, или рядом с сексуальной ориентацией? :-)
А не будет ли растратой ресурсов то, что я каждый раз подгружаю совершенно не нужные мне данные чтобы получить, допустим, список пользователей?У меня для Вас плохие новости: джанговский ORM загружает модели полностью. Даже если Вы обращаетесь к username пользователя, сервер БД передаст и фамилию, и имя, и пароль (захешированный, конечно) и пресловутую сексуальную ориентацию.
А имя и фамилия где должны храниться — там же, где пароль, или рядом с сексуальной ориентацией? :-)
У меня для Вас плохие новости: джанговский ORM загружает модели полностью. Даже если Вы обращаетесь к username пользователя, сервер БД передаст и фамилию, и имя, и пароль (захешированный, конечно) и пресловутую сексуальную ориентацию.
зачем плодить число запросов там, где можно этого не делать
Здесь же, нагрузка от обработки лишнего объема данных… превзойдет нагрузку от обработки большего числа запросов.Откуда такие выводы? Измерения проводились?
Но опять же, эти 20 запросов прекрасно превращаются в 10, с тем же объемом данных, если грамотно подойти к делу. А чтобы вытащить тот же объем из лишнего базе придется проделать бОльшую работу. Как уже говорили здесь, нормализация рулит.Не поспеваю за Вашей мыслью. Что значит «грамотно подойти к делу»? И при чём тут нормализация?
две сущности там, где нужна одна
Не нужно смешивать независимые друг от друга данные без необходимости.Они первые придумали засунуть необязательные поля
first_name и last_name в модель, которая по идее должна хранить только аутентификационную информацию.primate. Это магия и с ней надо быть осторожным. Я бы, пожалуй, рекомендовал прислушаться к совету kmike и наследовался модели, хоть это тоже не лишено некоторых рутинных дейтсвий, от которых избавляет примат. Или не позволяет выкинуть нежелательные поля.User у меня вызывает неприязнь. Ещё раз повторюсь, что речь идёт о случаях, когда нужен всего один тип профиля. У меня других не было, если что.Profile во вьюшке обновлять связанный с Profile объект User, получая из form.cleaned_data значения, которые нужно охранить у пользователя. Как-то так :)class ExtUser(User):
'''
Расширение стандартного класса пользователей
'''
class Meta:
proxy = True
Профили пользователей: плюсы, минусы, подводные камни