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.
"""
Quel est le problème? une exécution circulaire? – Gocht
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
@brendan si 'FK' d'un modèle est mis à jour, les signaux ne sont pas déclenchés pour ce modèle. – ozgur