1

仅与模型有关的循环导入错误似乎有很多问题,但我的模型和信号回调似乎也遇到了类似的问题。我对 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()

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

非常感谢任何关于我应该如何构建我的应用程序的建议。我应该把我的badgesaward_callback 放到models.py 中吗?这行得通(好吧,没有更多错误),但是当我以后可能会添加更多回调函数时,这是一个好方法吗?

4

2 回答 2

3

在更好的结构方面,而不是tasks.py重命名它signals.py和来自models.py

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

将此行移至signals.py末尾。然后你不需要from tasks import badgeaward_callback在 models.py中导入

于 2012-12-17T14:40:20.933 回答
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模型包。

于 2012-12-17T14:39:28.750 回答