Django 应用初始化代码(如连接信号)

8 投票
4 回答
3420 浏览
提问于 2025-04-15 18:12

我需要一个地方来运行一些特定于应用程序的初始化代码,比如连接信号。当我把代码放到应用程序的 __init__.py 模块里时,结果导致了模型之间的循环导入问题。

有没有办法在框架设置好之后、任何请求执行之前触发一个函数呢?

我使用的是比较旧的 Django 版本 96.6,但我也对当前版本的解决方案感兴趣。

关于与其他问题重复的说明: 下面是我的问题与 S.Lott 在评论中提到的重复问题的不同之处:

对当前解决方案的评论: 我不能使用 urls,因为我的大多数应用程序没有暴露任何 urls。它们只是监听信号,并在数据库中存储额外的信息。

4 个回答

3

如果你不提供网址,那你就真的需要把它放在 models.py 里,这就是规则。

接下来谈谈你的问题:你想把它定义在自己的模块里,挺好的,去做吧。为了避免循环导入的问题,可以使用 django.db.models.get_model 来动态获取模型。你可以为你的信号模块提供一个初始化函数,用来导入相关的模型并连接相应的信号。这个函数会在 models.py 的最后被调用,只会运行一次,并且是在你的模型初始化之后。

不过还是有可能这个方法不奏效(如果在你设置的时候模型还没准备好),但你可以试试看,告诉我们结果如何。

5

这种东西最好的放置地方就是...随便哪里,只要在你的urls.py文件里导入就行了(因为很明显,urls是在任何请求之前加载的)。

6

信号,具体来说,建议放在你应用的 models.py 文件里。

你可以试试在 models.py 或者 urls.py 里看看,看看能不能成功。

撰写回答