当前位置: 首页 > 面试题库 >

如何monkey修补Django?

益源
2023-03-14
问题内容

我遇到了有关monkey修补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. 我将把monkey补丁代码放在哪里?
  2. 代码何时运行-仅运行一次?每个Python解释器启动一次?每个请求一次?
  3. 大概我仍然需要更改数据库架构。因此,如果我放下桌子User运行./manage.py syncdb,会syncdb“知道”是否已添加新字段User吗?如果没有,如何更改架构

问题答案:

你可以将其放置在任何位置,但通常会在设置文件(甚至是urlconf)中看到这种链接。你可以在任何地方发出信号的地方也可能合适。这段代码确实应该稍微聪明一些-通常文件会被多次导入,因此你无能为力,因此,如果你尝试多次运行这样的代码,可能会遇到问题。

对于每个python进程,该代码至少需要执行一次。

是的,你需要手动更改数据库。Syncdb 可能不会捕获更改(我没有仔细研究代码),但是可能在某些地方可以放置代码。

你似乎已经知道这是一件可怕的事情,绝不应该在真正的代码中完成,所以我不会为这一点感到遗憾。除了在将来的Django版本中可能无法使用的代码之外,执行此类操作是一种在代码中生成真正难以发现的错误的绝妙方法

另外,它不适用于你应该使用的South。



 类似资料:
  • 问题内容: 我知道,如果go代码的结构使其可以编程为接口,那么模拟起来就很简单了。但是,我正在使用无法更改的代码库(不是我的),情况并非如此。 该代码库是高度互连的,并且仅对结构进行编程,而没有对接口进行编程,因此没有依赖项注入。 这些结构本身仅包含其他结构,因此我也无法以这种方式进行模拟。我不相信我可以对方法做任何事情,并且存在的少数几个函数不是变量,所以我不知道如何将它们换出。继承在golan

  • 问题内容: 我在用另一个功能替换另一个模块中的功能时遇到麻烦,这让我发疯。 假设我有一个看起来像这样的模块bar.py: 我还有另一个看起来像这样的模块: 我希望得到结果: 但是我得到了这个: 我究竟做错了什么? 问题答案: 考虑一下Python名称空间的工作原理可能会有所帮助:它们实际上是字典。因此,当您执行此操作时: 这样想: 希望您能明白为什么它不起作用:-)将名称导入名称空间后, 从中 导

  • 问题内容: 我正在使用其他人编写的模块。我想猴子修补模块中定义的类的方法。我发现的示例显示了如何执行此操作的所有示例均假设我自己将自己称为该类(例如Monkey-patch Python类)。然而,这种情况并非如此。在我的情况下,该类是在另一个模块的函数中初始化的。请参阅下面的(大大简化的)示例: thirdpartymodule_a.py thirdpartymodule_b.py mymodu

  • 问题内容: 我遇到了有关猴子修补Django的帖子: 我知道这不是理想的选择,最好通过单独的模型添加字段和函数。 话虽如此,我只想了解这将如何工作: 我将把monkey补丁代码放在哪里? 代码何时运行-仅运行一次?每个Python解释器启动一次?每个请求一次? 大概我仍然需要更改数据库架构。因此,如果我放下桌子运行,会“知道”是否已添加新字段吗?如果没有,如何更改架构? 问题答案: 您可以将其放置

  • 本文向大家介绍python 猴子补丁(monkey patch),包括了python 猴子补丁(monkey patch)的使用技巧和注意事项,需要的朋友参考一下 写了一段时间java切回写python偶尔会出现一些小麻烦,比如:在java中自定义对象变成json串很简单,调用一个方法就行,但同样的转换在python中却不太容易实现。在寻找python自定义对象转json串的过程中,接触到了猴子补

  • 我正在使用Visual Studio Code进行编码,但最近我遇到了奇怪的问题,该如何解决? 当我输入php artisan tinker时,tinker文本不像往常一样,我记得颜色是蓝色的,但现在是白色的。同样在使用php artisan migrate和etc命令后,结果文本是白色的 我卸载了Vscode以及所有appdata和扩展以及与之相关的任何东西,但在安装最新版本后没有任何变化,修补