2015-08-02 2 views
2

Cela semble être une question assez simple mais je vais avoir du mal à trouver la réponse à cette question:Utilisation du post_save du modèle Django pour l'invalidation manuelle du cache: les clés étrangères déclenchent-elles save()?

Do modèles Django avec une clé étrangère jamais appeler la méthode save() du modèle qu'ils pointant quand ils sont sauvegardés/modifiés? Je travaille sur un modèle pour les examens SAT pris, notés et notés - dont le dernier implique la mise en cache et l'invalidation du cache - et essayant de comprendre juste quand je dois supprimer un objet Score mis en cache et recalculer il.

J'ai trois modèles: ExamResponse, QuestionResponse et ExamScore, qui pour concrétude nous pouvons dire ressembler à ceci:

class ExamResponse(models.Model): 
    user = models.ForeignKey(User) 
    exam = models.ForeignKey(Exam) 

class QuestionResponse(models.Model): 
    exam_response = models.ForeignKey(ExamResponse) 
    answer = models.TextField() 
    score = models.smallIntegerField(default=0) 

class ExamScore(models.Model): 
    exam_response = models.ForeignKey(ExamResponse) 
    score = models.smallIntegerField(default=0) 

Chaque fois qu'un grades enseignant un de QuestionResponse (en modifiant le champ de score), je veux supprimez tout ExamScore associé à ExamResponse de QuestionResponse. Puis-je écouter un signal d'une modification d'un objet ExamResponse?

@receiver(post_save, model=ExamResponse) 
def invalidate_exam_response_stats(sender, **kwargs): 
    """ 
    Delete the ExamScore associated with this ExamResponse 
    since it's become invalid. 
    """ 

Ou dois-je écouter les QuestionResponses réels soient sauvés?

@receiver(post_save, model=QuestionResponse) 
def invalidate_exam_response_stats(sender, **kwargs): 
    """ 
    Look up the QuestionResponse's ExamResponse, then delete 
    the associated ExamScore. 
    """ 
+0

Quel est le problème? une exécution circulaire? – Gocht

+0

Quoi? Non ... le problème est l'incertitude quant à savoir si le signal post_save d'ExamResponse sera envoyé quand quelque chose avec un fk y est enregistré – Brendan

+1

@brendan si 'FK' d'un modèle est mis à jour, les signaux ne sont pas déclenchés pour ce modèle. – ozgur

Répondre

1

Réponse: non, ils ne le font pas.

Je devrais écouter les objets QuestionResponse.

Merci @ozgur pour cette réponse.

+1

Merci d'avoir pris le temps de répondre à votre propre question puisque vous avez reçu votre réponse dans les commentaires. Cela aide vraiment à améliorer le site. N'oubliez pas de revenir et d'accepter votre propre réponse dans un jour ou deux! –

+0

Fera! Merci! – Brendan