Расширение поля фоновой модели в 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. Мое первоначальное предположение, что это должно быть довольно легко.