0

ここに私のmodels.pyのコードがあります

#Models.py
....
class Question(models.Model):
    text = models.TextField(unique=True)
    exam = models.ForeignKey(Exam)
    level = models.ForeignKey(Level)
    paper = models.ForeignKey(Paper)
    topic = models.ForeignKey(Topic)
    date_added = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

class Answer(models.Model):
    question = models.ForeignKey(Question)
    text = models.CharField(max_length=125)
    is_correct = models.BooleanField()
    explanation = models.TextField(blank=True)
    date_added = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

@receiver(post_delete, sender=Question)
def update_redis_deleted(sender, **kwargs):
    host = getattr(settings, 'SESSION_REDIS_HOST', 'localhost')
    port = getattr(settings, 'SESSION_REDIS_PORT', 6379)
    db = getattr(settings, 'SESSION_REDIS_DB', 0)

    server = redis.StrictRedis(host, port, db)

    pipe = server.pipeline()

    question = kwargs['instance']
    answer_set_list = question.answer_set.all()
    answer = Answer.objects.get(question=question)

私のテストから、質問インスタンスを削除するanswer_set_listと空のリストになりanswer、DoesNotExist エラーがスローされます。私のtests.pyでは、question.answer_set.all()期待どおりにAnswer.objects.get(question=question)動作します。
誰かがこれを修正し、この奇妙さを説明するのを手伝ってくれることを願っています(少なくとも私の初心者には)

4

1 に答える 1

3

このコードは、削除後にトリガーされます。つまり、削除は既に行われているため、Question オブジェクトはデータベースに存在しなくなり、クエリは失敗します。

代わりに pre-delete シグナルを使用することをお勧めします。

于 2012-07-12T23:33:21.310 に答える