pre_delete我正在嘗試為我的 Django 應用程序模型使用信號Like。該Like模型有一個Book外鍵。該Book模型有一個num_of_likes字段。最終,我試圖num_of_likes從我的信號中更新這個字段pre_delete。只是我做不到。我的代碼會讓問題是什么變得非常清楚,我想(請特別注意注釋和打印語句):書籍/模型.py:class Book(models.Model): num_of_likes = models.IntegerField()喜歡/ models.py:class Like(models.Model): user = models.ForeignKey(User) book = models.ForeignKey(Book)喜歡/views.py:class DeleteLikeView(APIView): def post(self, request, book): book = get_object_or_404(Book, id=book) print(book.num_of_likes) # Prints, say, 10 like = Like.objects.get(user=request.user, book=book) like.delete() # triggers signal handler below (should update `book.num_of_likes`) print(book.num_of_likes) # Still prints 10, expected 9 <------ PROBLEM return ...喜歡/信號.py:@receiver(pre_delete, sender=Like)def delete_book_like(sender, instance, **kwargs): print(instance.book.num_of_likes) # Prints 10 instance.book.num_of_likes -= 1 instance.book.save() print(instance.book.num_of_likes) # Prints 9, as expected為什么book.num_of_likes內部得到更新delete_book_like但更改卻沒有顯示在 中DeleteLikeView?
1 回答

qq_笑_17
TA貢獻1818條經驗 獲得超7個贊
book刪除視圖中的 是與信號處理程序中不同的Python對象。instance.bookPython 對象不會神奇地了解到底層數據庫表示已更改。您可以refresh_from_db在打印前調用:
book.refresh_from_db()
print(book.num_of_likes)
或者只是創建num_of_likes一個動態評估的屬性,您不必擔心非規范化數據的完整性:
class Book(models.Model):
@property
def num_of_likes(self):
return self.like_set.count()
添加回答
舉報
0/150
提交
取消