django信号,正确的方式

时间:2012-08-17 17:51:05

标签: django

好吧,我有一个通用的问题..我想让我的models.py非常干净......除了宣布模型之外别无其他的东西。

假设我有这个为models.py

class UserProfile(models.Model:
    user = models.OneToOneField(User, related_name='profile')
    #other stuff

这是我的signals.py

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        profile, created = UserProfile.objects.get_or_create(user=instance)

post_save.connect(create_user_profile, sender=User)

如何告诉我的应用程序这是我的信号文件? ..我必须在models.py中声明它们吗?

//小鼠

2 个答案:

答案 0 :(得分:1)

嗯 - 我看到了一种我喜欢的方式。在同一个应用程序中创建receivers.py或signals.py,然后输入信号接收方法,然后导入所有这些方法并连接到models.py中的信号。

甚至(如果你喜欢使用装饰器来定义连接信号,我总是使用它) - 在models.py的末尾导入整个receivers.py:from app.receivers import *

在这个解决方案中,我唯一不喜欢的是它有时以你必须关心的循环依赖结束。

答案 1 :(得分:0)

你必须在某处导入signals.py以便它被执行并且django会注册信号和处理程序。

优选地,将其包括在models.py中,以便足够早地包括它,以便在生成任何信号之前注册信号处理程序。