Расширение поля фоновой модели в Django

Я сталкивался с этой ситуацией несколько раз.

Если у меня есть что-то, что мне обычно нравится в contrib, но я хочу сделать небольшую настройку в поле, что мне делать?

Я не хочу выбрасывать ребенка с водой.

В качестве примера возьмем auth.user (который, вопреки распространенному мнению по этому вопросу, я считаю в целом правильным). Я хочу создать сквозную модель для отношения auth.user к auth.group.

Как я могу сделать это без изменения Django?

1 ответ

auth.User Это особый случай, так как модель User связана со многими частями Django, и изменить это сложно (хотя и не невозможно, как отмечали другие). Мой лучший совет - спросить, почему вы не хотите изменять исходный код Django. Вы можете получить исходный код либо для заголовка ветки devel, либо для получения версии с тегом, соответствующей нумерованному выпуску. Измените код по желанию и используйте некоторую комбинацию svn update, svn diff, а также svn patch перенести ваши изменения.

Далее, в вашем коде возможны модификации модулей contrib, поскольку Python интерпретируется и динамически типизируется. Если вы сделаете это, вам нужно будет принять во внимание порядок разбора / обработки, поскольку некоторые операции уже могли использовать исходный модуль. Ниже приведен пример, который я получил от кого-то другого (вероятно, здесь, на SO), как добавить удобную прямую ссылку от User в связанный Profile объект:

from django.db.models import Model
from django.contrib.auth.models import User

class UserProfile(Model):
    user = ForeignKey(User, unique=True)
    phone = CharField(verbose_name="phone number", blank=False, max_length='20')

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

Я не думаю, что эта стратегия будет работать для добавления / изменения ModelFields в django.contrib.auth.models.User, тем не мение.

Наконец, для вашего конкретного примера связывания групп с пользователем вы должны увидеть, возможно ли это, создав модель UserProfile. Мое первоначальное предположение, что это должно быть довольно легко.

Другие вопросы по тегам