About Blog Dev | Alfa Romeo SZ Conkeror wishlist

Пользователь и его профиль

Известная штука, что у 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 будет меняться. Но такой способ настолько выгоднее и удобнее, что я решил наплевать на эти трудности. :-)

И ещё одно - спасибо Амиту, который и показал конкретно, как это сделать. ;-)

Add post to: Delicious Reddit Slashdot Digg Technorati Google
Comment

Comments

plisk 13.01.2008 2:25

Спасибо :) Как раз уже пару дней думал, как бы это красивее сделать. Только для newforms-admin ветки код добавления в админку будет тип того:

from django.contrib.auth.admin import UserAdmin

UserAdmin.fieldsets[1][1][‘fields’] = (‘first_name’, ‘last_name’, ‘email’, ‘ip’, ‘street’)

reply
Александр Соловьёв 13.01.2008 11:28

Ну я на обычной пока сижу. :-) Интересно, сколько осталось ждать до сливания веток?

reply
plisk 14.01.2008 2:26

Судя по количеству блокирующих сливание тикетов ещё порядком :).

reply
Fresh 24.01.2008 23:19

А где размещать код monkey patching’а? Когда я пишу его в любом файле, используя импорт contrib.auth’овсого юзера, при синхронизации (syncdb) таблица auth_user на меняется по сравнению со стандартной.

reply
Александр Соловьёв 25.01.2008 15:12

В каком-то из установленных приложений в models.py. У меня, к примеру, есть выделенное приложение для работы с аккаунтами - accounts, там и пишу.

reply

Comment form for «Пользователь и его профиль»

Required. 30 chars of fewer.

Required.