0

Here is code from my 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)

From my tests, when I delete a Question instance, answer_set_list is an empty list and answer throws the DoesNotExist error. In my tests.py, question.answer_set.all() and Answer.objects.get(question=question) work as expected.
I wish someone could help me remedy this and explain this weirdness (at least to my noob mind)

Tundebabzy
  • 829
  • 2
  • 11
  • 24

1 Answers1

3

This code is triggered post-delete. In other words, the delete has already happened, so the Question object no longer exists in the database, and querying it will fail.

You probably want to use the pre-delete signal instead.

Daniel Roseman
  • 588,541
  • 66
  • 880
  • 895