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()

したがって、モデルはbadgaward_callbackをインポートしています(これは私が得るエラーです:名前badgeaward_callbackをインポートできません)が、タスクはポイントモデルをインポートしています-これが私のエラーの根本的な原因であると思います。

アプリをどのように構成すべきかについてのアドバイスは大歓迎です。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 に答える