我怎样才能修补另一个包的管理类?

时间:2012-10-16 08:39:56

标签: python django monkeypatching

我的Django项目使用的其中一个软件包有一个简单的管理类,如下所示:

class EventUpdateInline(admin.StackedInline):
    model = EventUpdate

class EventAdmin(admin.ModelAdmin):
    form = EventForm
    list_display = ('date_created', 'description', 'status', 'date_updated')
    search_fields = ('description', 'message')
    list_filter = ('services',)
    inlines = [EventUpdateInline]

我已经编写了一个我想要使用的自定义EventUpdateInline课程。如何将EventUpdateInline替换为CustomEventUpdateInline类?

这是第一个问题。问题的第二部分是我要向EventUpdate模型添加自定义属性,以便我的CustomEventUpdateInline类可以使用它。

我将我的代码放在哪里导入CustomEventUpdateInline并替换旧版本,将自定义属性添加到EventUpdate模型?

我不确定这是否可行。感谢

1 个答案:

答案 0 :(得分:3)

编辑:

tl; dr:fork并使用pip / virtualenv代替 - 它是一种更清洁,可维护和理智的方法。猴子补丁通常是一个可怕的想法 - 见与SO答案相关联。但有时它是较小的邪恶。

如果你想要一个快速而又脏的猴子补丁 - https://stackoverflow.com/a/6720998/473285

但是现在通常情况下,如果项目是在github或bitbucket或我刚刚克隆它的任何东西,进行我的更改,然后使用pip -e安装我的克隆版本(你正在使用virtualenv,对吧?) 。如果您认为您的更改将被上游接受,这是最好的方法。

要考虑的另一件事是向前兼容性。将第三方软件包更新到更高版本后,您的猴子修补仍然有效吗?你的git变化会干净地合并吗?

通常我会在一些或所有这些罕见的情况下使用猴子补丁:

  • 你正在编写一个软件包以供分发,但是你需要修改另一个第三方软件包以使工作正常(很少见,只有在第三方维护者不接受补丁的情况下才有效)
  • 你正在做一个相对直接的替代类,方法或函数,它们将与包的内部结构完全融合。
  • 代码不可用或者不是使用pip / virtualenv(罕见)易于使用的形式
  • 您认为代码不会升级,或者您需要升级(不太可能)
  • 你没有使用pip / virtualenv(糟糕,但有时不可能用于遗留,非传统或配置错误的安装)。
  • 您认为上游维护者不会接受您的更改,或者他们对其他任何人都有用。

如果您正在做更多涉及的更改或更广泛有用的事情,那么经常分叉然后尝试上游被接受是最好的。即使你的改变是为了促进纯粹的内部东西,这些东西永远不会在你的项目之外的任何地方使用,virtualenv是迄今为止更好的方式。