21

サムネイル画像を含むモデル - 製品があります。製品に関連付けられた画像を含む別のモデル、ProductImage があります。製品インスタンスが削除されたときにサムネイルと画像の両方をサーバーから削除したいのですが、しばらくの間はうまくいったように見えましたが、もううまくいきませんでした。

関連コード...

Class Product(models.Model):
    title = Charfield
    thumbnail = ImageField(upload_to='thumbnails/', verbose_name='thumbnail', blank=True, )

Class ProductImage(models.Model):
    product = models.ForeignKey(plant, default=None, related_name='images')
    image = models.ImageField(upload_to='images/', verbose_name='image',)

次の削除メソッド (製品クラス内) は機能していましたが、コードを変更したところ機能しなくなりました。私が読んだことから、delete() をオーバーライドするのではなく、post_delete を使用するのがベスト プラクティスです。

def delete(self):
    images = ProductImage.objects.filter(product=self)
    if images:
        for image in images:
            image.delete()
    super(Product, self).delete()

私が望むものを達成するdeleteメソッドを書き直すにはどうすればよいですか? post_delete を使用しようとしましたが、 ProductImage インスタンスの削除に関しては、それを適用する方法がわからないため、これまでのところ失敗しています...

4

3 に答える 3

40

そして、ここに例がありpost_deleteます:

import os
from django.db import models

def _delete_file(path):
   """ Deletes file from filesystem. """
   if os.path.isfile(path):
       os.remove(path)

@receiver(models.signals.post_delete, sender=ProductImage)
def delete_file(sender, instance, *args, **kwargs):
    """ Deletes image files on `post_delete` """
    if instance.image:
        _delete_file(instance.image.path)

@receiver(models.signals.post_delete, sender=Product)
def delete_file(sender, instance, *args, **kwargs):
    """ Deletes thumbnail files on `post_delete` """
    if instance.thumbnail:
        _delete_file(instance.thumbnail.path)

メソッドのオーバーライドdelete():

class Product(models.Model):
    ...

    def delete(self):
        images = ProductImage.objects.filter(product=self)
        for image in images:
            image.delete()
        self.thumbnail.delete()
        super(Product, self).delete()


class ProductImage(models.Model):
    ...

    def delete(self):
        self.image.delete()
        super(ProductImage, self).delete()

Cascade削除について読む: docs

于 2015-10-12T12:21:18.073 に答える
0

システムからファイルを効果的に削除するには、次を試してください。

files = modelName.objects.all().get(columnName=criteria)

files.columnNameFile.delete() files.columnNameFile2.delete() . . .

于 2022-02-18T20:07:09.300 に答える