Расширение поля фоновой модели в Django - PullRequest
3 голосов
/ 14 марта 2011

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

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

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

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

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

1 Ответ

0 голосов
/ 16 марта 2011

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

...