删除与模型相关联的文件 - django [英] Deleting files associated with model - django

查看:118
本文介绍了删除与模型相关联的文件 - django的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的一个模型中有以下代码

  class PostImage(models.Model):
post = models.ForeignKey(Post,related_name =images)
#@@@@找出一种每个用户拥有图像文件夹的方式...
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)

当在 PostImage 上调用delete()方法时,我正在尝试删除文件。但是,这些文件没有被删除。



正如你所看到的,我覆盖了delete()方法,并删除每个 ImageField 。因为某些原因,文件没有被删除。

解决方案

您可以使用多种方法删除模型实例。 >

一种方法是调用 delete()

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

在这种情况下,调用 delete(),因此文件将被删除。但是您也可以使用查询器删除对象:

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

区别在于使用后一种方法,Django将通过使用SQL DELETE 命令,因此不调用每个对象的 delete()方法。所以可能你使用查询语言删除对象,因此文件不会被删除。



您可以使用 post_delete Django信号如下:

  @receiver(post_delete,sender = PostImage)
def post_delete_user(sender, ,* 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()方法。



更多关于这个 here 这里


I have the following code in one of my models

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)

I am trying to delete the files when the delete() method is called on PostImage. However, the files are not being removed.

As you can see, I am overriding the delete() method, and deleting each ImageField. For some reason however, the files are not being removed.

解决方案

You can delete a model instance with multiple methods.

One method is by calling delete():

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

In this case the delete() is called, hence the files will be removed. However you can also delete objects by using querysets:

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

The difference is that using the latter method, Django will delete the objects in bulk by using SQL DELETE command, hence the delete() method for each object is not called. So probably you are deleting objects using querysets, and therefore files are not being removed.

You can solve this by using post_delete Django signal as follows:

@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)

Please note that if you use this method, you don't have to overwrite the delete() method anymore.

More about this here and here

这篇关于删除与模型相关联的文件 - django的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆