我在《猴子修补姜戈》上发现了这一点:
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
中。有了这句话,我只想了解这是如何工作的:
我应该把猴子的修补代码放在哪里?
代码什么时候运行——只运行一次?每次启动python解释器一次?每个请求一次?
大概我还需要更改数据库模式。因此,如果我删除了表并运行了
Profile
,会不会知道有一个新字段被添加到了User
?如果没有,如何更改模式? 最佳答案
你可以把它放在任何地方,但是在设置文件(甚至是urlconf)中看到这种链接是很常见的。任何你可以放信号的地方也可能是合适的。这段代码真的应该稍微智能一点——通常文件会被多次导入,而你对此却无能为力,所以如果你多次尝试运行这样的代码,你可能会遇到问题。
对于每个Python进程,至少需要执行一次代码。
是的,您需要手动更改数据库。SyncDB可能无法捕捉到更改(我没有仔细查看代码),但可能有一些地方您可以将代码放在可以工作的地方。
你似乎已经知道这是一件可怕的事情,而且永远不应该为真正的代码而做,所以我不会对这一点进行长篇大论。这样做是一种非常好的方法,可以在代码中生成很难发现的错误,除了在未来版本的Django中可能不起作用的代码之外。
而且,它也不能很好地与南方,你应该使用。
关于python - 如何猴子补丁Django?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6720858/