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项目中的那个就可以了。
答案 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。