ホームページ >バックエンド開発 >Python チュートリアル >Django モデルの delete メソッドをオーバーライドする

Django モデルの delete メソッドをオーバーライドする

WBOY
WBOY転載
2024-02-11 19:15:041367ブラウズ

重写 django 模型中的删除方法

#質問内容

オブジェクトの保存時にsaveメソッドでprintを呼び出すページモデルがあります。ただし、オブジェクトが削除されると、印刷はトリガーされず、delete メソッドは呼び出されないようです。では、デフォルトの削除メソッドをオーバーライドするにはどうすればよいでしょうか?

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)


正解


オブジェクトを削除するときは、モデルの

delete メソッドを呼び出します。クエリセットを削除しようとすると (たとえば、django 管理者リスト ページから)、モデルのクエリセットを上書きする必要があります。 リーリー

以上がDjango モデルの delete メソッドをオーバーライドするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。