重寫 django 模型中的刪除方法
我有一個頁面模型,在儲存物件期間呼叫 save 方法中的列印。但是,當物件被刪除時,不會觸發任何列印,並且似乎永遠不會呼叫刪除方法。那我應該如何覆蓋預設的刪除方法呢?
class Page(models.Model): image = models.ImageField() number = models.PositiveIntegerField(default=0, blank=True, null=True) chapter = models.ForeignKey(Chapter, on_delete=models.CASCADE) def get_upload_path(self, filename): work_slug = self.chapter.volume.work.slug translator_name = slugify(self.chapter.volume.translator) volume_number = self.chapter.volume.number chapter_number = self.chapter.number name, extension = filename.rsplit('.', 1) return f'media/{work_slug}/{translator_name}/volumes/volume-{volume_number}/chapters/chapter-{chapter_number}/page-{self.number}.{extension}' def save(self, *args, **kwargs): if not self.pk: last_page = self.chapter.page_set.last() if last_page: self.number = last_page.number + 1 self.image.name = self.get_upload_path(self.image.name) self.image.storage = s3 print(f"Saving Page with image: {self.image.name}") super().save(*args, **kwargs) def delete(self, *args, **kwargs): print(f"Deleting Page with image: {self.image.name}") image_name = self.image.name try: s3.delete(image_name) print(f"Successfully deleted from S3: {image_name}") except Exception as e: print(f"Error deleting from S3: {e}") super().delete(*args, **kwargs)
正確答案
刪除一個物件時呼叫 model 的 delete
方法。如果您嘗試刪除查詢集(例如從 django 管理清單頁面刪除),您必須覆寫模型的查詢集。
class PageQuerySet(models.QuerySet): def delete(self): print("deleting queryset") return super().delete() class PageManager(models.Manager): def get_queryset(self): return PageQuerySet(model=self.model, using=self._db, hints=self._hints) class Page(models.Model): image = models.ImageField() number = models.PositiveIntegerField(default=0, blank=True, null=True) chapter = models.ForeignKey(Chapter, on_delete=models.CASCADE) objects = PageManager() def get_upload_path(self, filename): work_slug = self.chapter.volume.work.slug translator_name = slugify(self.chapter.volume.translator) volume_number = self.chapter.volume.number chapter_number = self.chapter.number name, extension = filename.rsplit('.', 1) return f'media/{work_slug}/{translator_name}/volumes/volume-{volume_number}/chapters/chapter-{chapter_number}/page-{self.number}.{extension}' def save(self, *args, **kwargs): if not self.pk: last_page = self.chapter.page_set.last() if last_page: self.number = last_page.number + 1 self.image.name = self.get_upload_path(self.image.name) self.image.storage = s3 print(f"Saving Page with image: {self.image.name}") super().save(*args, **kwargs) def delete(self, *args, **kwargs): print(f"Deleting Page with image: {self.image.name}") image_name = self.image.name try: s3.delete(image_name) print(f"Successfully deleted from S3: {image_name}") except Exception as e: print(f"Error deleting from S3: {e}") super().delete(*args, **kwargs)
以上是重寫 django 模型中的刪除方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

Uvicorn是如何持續監聽HTTP請求的? Uvicorn是一個基於ASGI的輕量級Web服務器,其核心功能之一便是監聽HTTP請求並進�...

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

攻克Investing.com的反爬蟲策略許多人嘗試爬取Investing.com(https://cn.investing.com/news/latest-news)的新聞數據時,常常�...
