4

我遇到了post_save无缘无故被调用两次的问题。现在看来,原因是这里描述的双重导入:为什么在保存 Django 模型期间 post_save 被提升两次?接受答案建议删除其中有效的mysite部分mysite.foo,但为什么要进行双重导入?

4

1 回答 1

3

该问题是由在 Python 中混合导入路径引起的。以下面的结构 w/ projfindable insys.path为例。

proj/
   __init__.py
   app/
       __init__.py
       foo.py

# In proj directory, enter Python shell
>>> import sys

>>> before = set(sys.modules)
>>> import app.foo
>>> set(sys.modules) - before
set(['app', 'app.foo'])

>>> before = set(sys.modules)
>>> from proj.app import foo
>>> set(sys.modules) - before
set(['proj.app.foo', 'proj', 'proj.app'])

Python 实际上将proj.app.fooapp.foo视为不同的模块。您可以找到它app/__init__.pyapp/foo.py导入两次,因此其中的任何内容实际上都会执行两次。为了解决这个问题,我们应该使用一致的导入路径:从proj级别或从../proj级别。在您发布的链接中,只要项目或 Django 文件中'mysite.blog'没有其他导入就可以了。import blog

在 Django 1.4 中,该问题主要通过将 manage.py 一个目录从项目目录向上移动到其不再是包的父目录来解决,从而将导入限制为projlevel

您也可以通过使用来防止重复信号dispatch_uid

于 2012-04-22T04:14:07.463 回答