使用 Django 模型的 post_save 进行手动缓存失效:外键是否触发 save()?
Using Django model's post_save for manual cache invalidation: do foreign keys trigger save()?
这似乎是一个非常简单的问题,但我找不到答案:
当 它们 是 saved/changed 时,带有外键的 Django 模型是否会调用它们指向的模型的 save() 方法?
我正在研究一个模型,用于 SAT 考试的参加、评分和评分——最后一个涉及缓存和缓存失效——并试图弄清楚什么时候我必须删除缓存的 Score 对象和重新计算一下。
我有三个模型:ExamResponse、QuestionResponse 和 ExamScore,为了具体起见,我们可以这样说:
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)
每当教师对 QuestionResponse 评分(通过更改分数字段)时,我想删除与 QuestionResponse 的 ExamResponse 关联的任何 ExamScore。我可以监听 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.
"""
或者我必须听取要保存的实际问题响应吗?
@receiver(post_save, model=QuestionResponse)
def invalidate_exam_response_stats(sender, **kwargs):
"""
Look up the QuestionResponse's ExamResponse, then delete
the associated ExamScore.
"""
回答:不,他们不那样做。
我应该听听问题响应对象。
感谢@ozgur 的回答。
这似乎是一个非常简单的问题,但我找不到答案:
当 它们 是 saved/changed 时,带有外键的 Django 模型是否会调用它们指向的模型的 save() 方法?
我正在研究一个模型,用于 SAT 考试的参加、评分和评分——最后一个涉及缓存和缓存失效——并试图弄清楚什么时候我必须删除缓存的 Score 对象和重新计算一下。
我有三个模型:ExamResponse、QuestionResponse 和 ExamScore,为了具体起见,我们可以这样说:
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)
每当教师对 QuestionResponse 评分(通过更改分数字段)时,我想删除与 QuestionResponse 的 ExamResponse 关联的任何 ExamScore。我可以监听 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.
"""
或者我必须听取要保存的实际问题响应吗?
@receiver(post_save, model=QuestionResponse)
def invalidate_exam_response_stats(sender, **kwargs):
"""
Look up the QuestionResponse's ExamResponse, then delete
the associated ExamScore.
"""
回答:不,他们不那样做。
我应该听听问题响应对象。
感谢@ozgur 的回答。