2

我按照说明在里面创建了我的 post_syncdb 信号app/management/__init__.py

from django.db.models.signals import post_syncdb
from django.contrib.auth.models import Group, Permission
import payment.models as payModels


def initialization(sender, **kwargs):
    """ initialization when appliation starts """
    agents = Group.objects.get(name = "agents")
    import pdb
    pdb.set_trace()
    if not agents.permissions.filter(codename="can_buy_package").exists():
        perm = Permission.objects.get(codename="can_buy_package")
        agents.permissions.add(perm)

post_syncdb.connect(initialization, sender= payModels)

信号运行,但在那里使用 python 调试器,似乎在那个特定时间没有权限,即使是标准权限也是为我在同一个应用程序中的模型创建的。

有人可以建议吗?

-----------------------更新-------------- -

在 Chris 发表评论后,我查看了调度程序类并将调试消息插入到相关文件中以了解更多信息。

本质上,在我的应用程序中(在列表中INSTALLED_APPScontenttype和更靠后的位置auth),它的post_syncdb处理程序首先被添加到信号中。原来是因为在安装过程中,Django 会在应用程序的 management/commands 文件夹中查找要安装的自定义命令,我的 management/ init .py 中的信号处理程序已执行。

然后我试着把post_syncdb.connect我的models.py. 运行跟踪显示使用 haystack 也可能遇到类似问题

(, '/Users/foo/.virtualenvs/property/lib/python2.6/site-packages/django/utils/importlib.py', 35, 'import_module', [' import (name)\n '], 0 ), (, '/Users/foo/.virtualenvs/property/lib/python2.6/site-packages/haystack/init .py', 121, 'autodiscove r', [' importlib.import_module
("%s.search_indexes " % app)\n'], 0), (, '
/Users/foo/Documents/workspace/property_buyer/haystack_sites.py', 2, '', ['haystack.autodiscover()\n'], 0 ), (, '/Users/foo/.virtualenvs/property/lib/python2.6/site-packages/django/utils/importlib.py
', 35, 'import_module', [' import (name)\n' ], 0), (, '/
Users/foo/.virtualenvs/property/lib/python2.6/site-packages/haystack/ init.py', 151, 'handle_registrations', [' search_sites_conf = importlib
.import_module(settings.HAYSTACK_SITECONF)\n'], 0), (, '/Users/foo/.virtualenvs/property/lib/python2.6/site -packa ges
/haystack/ init .py', 154, '', ['handle_registrations()\n'], 0), (, '/Users/foo/.virtualenvs/propert
y/lib/python2.6/site -packages/django/utils/importlib.py', 35, 'import_module', [' import (name)\n'], 0),

希望这对那些处理程序依赖于订单并遇到类似情况的人有用

4

1 回答 1

2

有两点需要注意。首先,post_syncdb信号是在每个应用程序同步后发送的,因此每个应用程序都会发送一次,而不仅仅是在最后发送一次。其次,似乎有一个固有且稳定的顺序,何时应用处理程序,但它是不可控的。

为了详细说明第二点,我花了 30 分钟的大部分时间盯着auth's 权限post_syncdb处理程序,我看不到任何真正确保它出现在contenttypes. 然而,尽管如此,它ContentType可以自由使用,相信一切都准备好了。我唯一的结论是应用程序的顺序INSTALLED_APPS很重要,并且列表中后面的应用程序似乎在列表中较早的应用程序之前处理了它们的处理程序。我唯一的结论是auth从 letter 开头的好处A,结果很少有人会把它移到contenttypes列表的下面。

这也意味着您的应用程序(不可避免地在contenttypesin之后定义INSTALLED_APPS)的信号处理程序在的那些之前contenttypes运行,这就是您的问题。这与其说是一种竞争条件,不如说它总是领先于contenttypes.

我想,您可以将您的应用程序向上移动INSTALLED_APPS,但这可能会导致其他无法预料的问题。您也可以尝试将sender属性更改为不同的模型文件,甚至可能是contenttypes,这可能会给它足够的时间来弹出。

于 2012-08-09T15:33:26.280 回答