Как обезьянить патч Django? - PullRequest
12 голосов
/ 17 июля 2011

Я наткнулся на этот пост по исправлению обезьян Django:

from django.contrib.auth.models import User

User.add_to_class('openid', models.CharField(max_length=250,blank=True))

def get_user_name(self):
    if self.first_name or self.last_name:
        return self.first_name + " " + self.last_name
    return self.username

User.add_to_class("get_user_name",get_user_name)

Я понимаю, что это не идеально, и лучше добавлять поля и функции к User через отдельную модель Profile.

С учетом сказанного, я просто хочу понять, как это будет работать:

  1. Куда бы я положил код исправления обезьяны?

  2. Когда запускается код - только один раз? один раз за запуск интерпретатора Python? один раз за запрос?

  3. Предположительно, мне все еще нужно изменить схему БД. Так что, если бы я уронил таблицу User и запустил ./manage.py syncdb, syncdb "знал бы", что к User добавлено новое поле? Если нет, как мне изменить схему?

Ответы [ 2 ]

14 голосов
/ 10 июля 2014

поместите файл monkey_patching.py в любой из ваших apps и импортируйте его в файл __init__.py приложения. то есть:

приложение / monkey_patching.py

#app/monkey_patching.py
from django.contrib.auth.models import User

User.add_to_class('openid', models.CharField(max_length=250,blank=True))

def get_user_name(self):
    if self.first_name or self.last_name:
        return self.first_name + " " + self.last_name
    return self.username

User.add_to_class("get_user_name",get_user_name)

Приложение / __ __ INIT. Ру

#app/__init__.py
import monkey_patching
6 голосов
/ 17 июля 2011

Вы можете поместить это куда угодно, но это часто встречается в файлах настроек (или даже в urlconf).Везде, где вы могли бы поставить сигнал, также может быть уместно.Этот код должен быть немного более интеллектуальным - часто файлы импортируются несколько раз, и с этим ничего не поделаешь, поэтому вы можете столкнуться с проблемами, если попытаетесь запустить такой код несколько раз.

Код должен быть выполнен по крайней мере один раз для каждого процесса Python.

Да, вам нужно изменить БД вручную.Syncdb , вероятно, не поймает изменения (я не внимательно изучил код), но могут быть некоторые места, где можно разместить код, который будет работать.

Вы, кажется,Я уже знаю, что это ужасно, ужасно, и никогда не следует делать это для реального кода, так что я не буду это понимать.Подобные действия - фантастический способ генерировать действительно трудные для поиска ошибки в вашем коде, в дополнение к коду, который может не работать в будущих версиях Django.

Кроме того, он не будет хорошо работать с South, который вы должны использовать.

...