python - 让 Django 将模型 id 包含在所有模型实例的字符串表示形式中以进行调试

标签 python django debugging monkeypatching

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/

相关文章:

python - python有嵌套异常保护吗?

python - matplotlib 饼图中缺少标签

python - Django 模型过滤器

.net - 如何获取 CLR 加载的类型列表?

python - 使用另一个多索引系列屏蔽数据框

python - 在 Django 中使用命令行设置 key ,以便在 Windows 上进行销售或安装

django - 如何更新已注释的查询集?

javascript - 如何找到调用函数的位置(函数调用堆栈)

ios - Obj-C、CLS_LOG Crashlytics 日志记录未在 Xcode 控制台中显示调试输出?

python - 使用 Python requests 模块发出的 PUT 请求没有数据