3

モデルの1つに次のコードがあります

class PostImage(models.Model):
    post =  models.ForeignKey(Post, related_name="images")
    # @@@@ figure out a way to have image folders per user...
    image = models.ImageField(upload_to='images')
    image_infowindow = models.ImageField(upload_to='images')
    image_thumb = models.ImageField(upload_to='images')
    image_web = models.ImageField(upload_to='images')
    description = models.CharField(max_length=100)
    order = models.IntegerField(null=True)

    IMAGE_SIZES = {
        'image_infowindow':(70,70),
        'image_thumb':(100,100),
        'image_web':(640,480),
    }

    def delete(self, *args, **kwargs):
        # delete files..
        self.image.delete(save=False)
        self.image_thumb.delete(save=False)
        self.image_web.delete(save=False)
        self.image_infowindow.delete(save=False)
        super(PostImage, self).delete(*args, **kwargs)

で delete() メソッドが呼び出されたときにファイルを削除しようとしていますPostImage。ただし、ファイルは削除されていません。

ご覧のとおり、delete() メソッドをオーバーライドし、それぞれを削除していImageFieldます。ただし、何らかの理由で、ファイルが削除されていません。

4

1 に答える 1

8

複数の方法でモデル インスタンスを削除できます。

1 つの方法は、次を呼び出すことdelete()です。

PostImage.objects.get(...).delete()

この場合、delete()が呼び出されるため、ファイルが削除されます。ただし、クエリセットを使用してオブジェクトを削除することもできます。

PostImage.objects.filter(...).delete()

違いは、後者の方法を使用すると、Django は SQLDELETEコマンドを使用してオブジェクトを一括で削除するdelete()ため、各オブジェクトのメソッドが呼び出されないことです。したがって、おそらくクエリセットを使用してオブジェクトを削除しているため、ファイルは削除されていません。

post_deleteこれは、次のように Django シグナルを使用して解決できます。

@receiver(post_delete, sender=PostImage)
def post_delete_user(sender, instance, *args, **kwargs):
    instance.image.delete(save=False)
    instance.image_thumb.delete(save=False)
    instance.image_web.delete(save=False)
    instance.image_infowindow.delete(save=False)

このメソッドを使用する場合、メソッドを上書きする必要はありませdelete()ん。

これについての詳細はこちらこちら

于 2012-10-15T03:33:57.627 に答える