亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Django - pre_delete 信號不更新實例的外鍵字段

Django - pre_delete 信號不更新實例的外鍵字段

心有法竹 2024-01-24 16:02:32
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()


查看完整回答
反對 回復 2024-01-24
  • 1 回答
  • 0 關注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號