获取Django将模型id包含在所有模型实例的字符串表示中以进行调试

时间:2014-09-08 00:36:02

标签: python django debugging monkeypatching

Django的模型Model类定义了一个__repr__方法,它将模型类名与实例的字符串表示形式相结合,这样一个典型的对象就会显示在shell中或调试工具中。格式如下:

<MyClass: string description of instance>

我想要的是我的所有对象实例都在他们的__repr__中显示他们的ID,例如

<MyClass 123: string description of instance>

这是为了方便调试。

现在,原则上很容易覆盖我的__unicode__方法(生成实例的字符串描述)以包含id,或者覆盖我的__repr__方法(或者让我的所有模型类派生自一个这样做的基类)。

但是,我正在使用现有的代码库,并且希望避免为此更改所有现有的模型类定义。改变方法的快捷方法是在Django的Model类中编辑__repr__的源代码。但是这会产生部署问题,因为我的项目总是从pip部署像Django这样的第三方库。

那么:如何让Django在所有对象实例的repr中包含id而无需更改Django源代码或我的项目模型类定义?

注意:我认为Model.__repr__的某种猴子补丁应该可以解决问题,但我不确定这是否有用,如果是这样,我的Django项目中的那个就可以了。

1 个答案:

答案 0 :(得分:1)

Monkeypatching Model.__repr__应该有效。类似的东西:

def debug_repr(self):
    return "<{} {}: {}>".format(self.__class__.__name__, self.pk, self)

Model.__repr__ = debug_repr

如果您想让它更强大,请参阅the implementation of __repr__()in the source code

执行此操作取决于您的调试设置。如果您在控制台中工作,则可以直接输入。如果要将其放在代码中但不干扰其他部署,则应该为调试环境创建一个新的设置文件,然后以这种方式触发monkeypatch。