Пользователь и его профиль
Известная штука, что у Django есть статическая (неизменяемая официально поощряемыми путями) модель User и костыль для дополнительных полей (которые может каким-либо образом использовать приложение) в виде настройки USER_PROFILE, указывающей на модельку-профиль. В результате использования такого костыля, если не делать дополнительных телодвижений, количество запросов возрастает (пример для данного блога, где каждому комментирующему ставится ссылка на его сайт) на число комментариев (даже не комментировавших, а комментариев!).
Для улучшения ситуации можно применить разные методы, в том числе и load_related, который использовал я. Недостаток заключается в том, что об этом деле надо всегда помнить и везде его применять - неоправданное усложнение кода, имхо.
Потому, после продолжительных колебаний и сомнений, я решил сделать всё радикальнее - удалить всю модель UserProfile, применив вместо неё monkey patching к стандартной модели:
User.add_to_class('site', models.URLField(verify_exists=False, blank=True))
User.add_to_class('email_new', models.EmailField(blank=True))
User._meta.admin.fields += (
('Byteflow Extensions', {'fields': ('site', 'email_new')}),
)
Конечно, главная проблема здесь - это то, что способ совершенно не стандартный и вряд ли кто-то будет ожидать, что табличка auth_user будет меняться. Но такой способ настолько выгоднее и удобнее, что я решил наплевать на эти трудности. :-)
И ещё одно - спасибо Амиту, который и показал конкретно, как это сделать. ;-)
Comments
Спасибо :) Как раз уже пару дней думал, как бы это красивее сделать. Только для newforms-admin ветки код добавления в админку будет тип того:
Ну я на обычной пока сижу. :-) Интересно, сколько осталось ждать до сливания веток?
Судя по количеству блокирующих сливание тикетов ещё порядком :).
А где размещать код monkey patching’а? Когда я пишу его в любом файле, используя импорт contrib.auth’овсого юзера, при синхронизации (syncdb) таблица auth_user на меняется по сравнению со стандартной.
В каком-то из установленных приложений в
models.py. У меня, к примеру, есть выделенное приложение для работы с аккаунтами -accounts, там и пишу.Comment form for «Пользователь и его профиль»