Django模型和信号回调函数之间的循环导入错误

时间:2012-12-17 14:26:10

标签: django

似乎有很多与圆形导入错误相关的问题只是模型,但我似乎遇到了与我的模型和信号回调类似的问题。我是Django的新手,所以很可能与我没有正确构建我的应用程序有关。一些代码:

徽章/ models.py:

from django.db import models
from django.contrib.auth.models import User
from datetime import datetime
from tasks import badgeaward_callback

class Award(models.Model):
    user = models.ForeignKey(User)
    description = models.TextField(blank=False)
    award_date = models.DateTimeField('date awarded',default=datetime.now)

    def __unicode__(self):
        return self.description

class Points(models.Model):
    POINT_TYPES = (
        ('signup', 'Sign up'),
        ...etc...
    )
    user = models.ForeignKey(User)
    points = models.IntegerField()
    date = models.DateTimeField('date created',default=datetime.now)
    description = models.TextField(blank=False)
    data = models.TextField(blank=True)
    type = models.CharField(max_length=20,choices=POINT_TYPES)

    def __unicode__(self):
        return self.description

models.signals.post_save.connect(badgeaward_callback, sender=Award)

徽章/ tasks.py

from badges.models import Points

def badgeaward_callback(sender, **kwargs):
    award = kwargs.get('award')

    p = Points()
    p.points = 100
    p.type = 'badgeawarded'
    p.description = award.description
    p.user = award.user
    p.save()

因此,模型正在导入badgeaward_callback(这是我得到的错误:无法导入名称badgeaward_callback),但任务正在导入Points模型 - 我认为这是我错误的根本原因。

我非常感谢有关如何构建我的应用程序的任何建议。我应该将badgesaward_callback放入models.py吗?这样做(好吧,没有更多的错误),但是后来我可能会添加更多的回调函数,这是一个很好的方法吗?

2 个答案:

答案 0 :(得分:3)

就更好的结构而言,不是tasks.py重命名signals.py而是来自models.py

models.signals.post_save.connect(badgeaward_callback, sender=Award)

结束时将此行移至signals.py。然后,您不需要在models.py

中导入from tasks import badgeaward_callback

答案 1 :(得分:1)

您可以将models.signals.post_save.connect(badgeaward_callback, sender=Award)移至tasks.py

from django.db import models
from badges.models import Award, Points

def badgeaward_callback(sender, **kwargs):
    award = kwargs.get('award')

    p = Points()
    p.points = 100
    p.type = 'badgeawarded'
    p.description = award.description
    p.user = award.user
    p.save()

models.signals.post_save.connect(badgeaward_callback, sender=Award)

然后在模型包的tasks中导入__init__.py