如何猴子补丁Django?

Con*_*ion 12 python django monkeypatching django-models

我发现这篇关于猴子修补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)
Run Code Online (Sandbox Code Playgroud)

我知道这并不理想,最好User通过单独的模型添加字段和函数Profile.

话虽如此,我只是想了解这是如何工作的:

  1. 我会把猴子修补代码放在哪里?

  2. 代码何时运行 - 只需一次?每个Python解释器启动一次?每次请求一次?

  3. 据推测,我仍然需要更改数据库架构.所以,如果我放弃桌子User并跑了./manage.py syncdb,会syncdb"知道"已经添加了一个新字段User吗?如果不是,我如何更改架构?

suh*_*lvs 14

把文件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)
Run Code Online (Sandbox Code Playgroud)

应用程序/ __ init__.py

#app/__init__.py
import monkey_patching
Run Code Online (Sandbox Code Playgroud)

  • 不适用于django 1.11.我得到django.core.exceptions.AppRegistryNotReady:尚未加载应用程序. (3认同)

Pau*_*lan 6

你可以把它放在任何地方,但是在设置文件(甚至是urlconf)中链接这种东西是很常见的.您可以放置​​信号的任何地方也可能是合适的.这段代码应该更加智能 - 通常文件不止一次被导入,而且你可以做很多事情,所以如果你试图多次运行这样的代码,你可能会遇到问题.

每个python进程需要至少执行一次代码.

是的,您需要手动更改数据库.Syncdb 可能无法捕获更改(我没有仔细查看代码),但可能有一些地方可以放置可行的代码.

你似乎已经知道这是一个可怕的,可怕的事情,永远不应该为真正的代码完成,所以我不会这样做.除了在未来版本的Django中可能无法运行的代码之外,做这种事情是在代码中生成真正难以发现的错误的绝妙方法.

此外,它不适用于你应该使用的南方.