2012-08-17 70 views
2

好吧,我有一个通用的问题..我想我的models.py很干净...没有其他的东西,而不是声明模型。django信号,正确的方法

可以说我有这个作为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中声明它们吗?

//鼠标

回答

1

嗯 - 我看到了我喜欢的一种方法。在同一个应用程序中创建receivers.py或signals.py,并将您的信号接收方法,然后将其全部导入并连接到models.py中的信号。

甚至(FE如果你喜欢用装饰来定义连接的信号,这是我经常使用) - 在models.py结束进口全receivers.py:from app.receivers import *

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

+1

这个解决方案几乎是唯一的方法,但循环依赖是一个杀手,尤其是当您使用应用自动发现(纯粹邪恶)的Haystack应用时。如果您必须这样做,请使用显式导入与'import *'。 @mouse,我赞赏你对干净的代码的渴望,但是这是一个情况,最好是把信号放在models.py的末尾 - 我对干净的代码有相同的倾向,这导致我拉我的头发以后经常出来。 – 2012-08-17 18:16:19

+0

谢谢。干净的代码有助于当维护一个软件 – debuggerpk 2012-08-18 11:31:13

0

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

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

+0

如果我在models.py中做它会不会创建一个循环依赖? – debuggerpk 2012-08-17 18:02:00

+0

@mouse您既可以在'models.py'的末尾移动导入信号,也可以从信号处理函数内部的models.py中导入模型,而不是在全局范围内导入。 – Rohan 2012-08-17 18:19:39