Django 的模型 Model
类定义了 __repr__
方法将模型类名与实例的字符串表示形式相结合,以便典型的对象将以以下格式显示在 shell 或调试工具中:
<MyClass: string description of instance>
我想要的是我的所有对象实例都在其 __repr__
中显示其 id ,例如
<MyClass 123: string description of instance>
这是为了调试方便。
现在,(原则上)很容易覆盖我的 __unicode__
方法(生成实例的字符串描述)以包含 ids,或者就此而言覆盖我的 __repr__
方法(或者让我的所有模型类都从这样做的基类派生)。
但是,我正在使用现有的代码库,并希望避免为此更改所有现有的模型类定义。改变事物的快速而肮脏的方法是编辑 __repr__
的源代码在 Django 的 Model 类中。但这会产生部署问题,因为我的项目总是从 pip 部署第三方库,例如 Django。
那么:如何让 Django 将 id 包含在所有对象实例的 repr 中,而不更改 Django 源代码或我的项目模型类定义?
注意:我正在考虑对 Model.__repr__
进行某种猴子补丁应该可以解决这个问题,但我不确定这是否可行,如果可行的话,在我的 Django 项目中的哪里可以做到这一点。
最佳答案
Monkeypatching Model.__repr__
应该可以工作。像这样的东西:
def debug_repr(self):
return "<{} {}: {}>".format(self.__class__.__name__, self.pk, self)
Model.__repr__ = debug_repr
这是基于 the implementation在源代码中。
执行此操作的位置取决于您的调试设置。如果您在控制台中工作,则可以直接输入此内容。如果您想将其放入代码中但不干扰其他部署,您可能应该为调试环境创建一个新的设置文件,然后以这种方式触发猴子补丁。
关于python - 让 Django 将模型 id 包含在所有模型实例的字符串表示形式中以进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25716043/