优化django代码模型

时间:2014-11-01 18:32:31

标签: django django-models model save

我想优化此代码。我认为最好的解决方案是使用pre_save方法而不是覆盖save方法。
这是在编辑时删除旧图像上传新图像的功能

def delete_old_image(sender, instance):
    try:
        obj = sender.objects.get(id=instance.id)
    except sender.DoesNotExist:
        pass 
    else:
        if not obj.image == instance.image:            
            try:
                os.remove(obj.image.path)
            except:
                pass 


根据模型的代码

class Service(models.Model):
    title= models.CharField(max_length=170)
    slug = models.SlugField(max_length=200, blank=True, unique=True, editable=False)
    def save(self, *args, **kwargs):
        self.slug = slugify(self.title) 
        super(Service, self).save(*args, **kwargs)          

class Portfoglio(models.Model):
    title= models.CharField(max_length=170, unique=True)
    slug = models.SlugField(max_length=200, blank=True, unique=True, editable=False)
    image=models.ImageField(upload_to = 'images/' , default= 'images/foto.jpg', verbose_name='upload')
    def save(self, *args, **kwargs):
        self.slug = slugify(self.title) 
        if self.id is not None:
          delete_old_image(Portfoglio, self)
        super(Portfoglio, self).save(*args, **kwargs)   

class Image(models.Model):
    title= models.CharField(max_length=200)
    image=models.ImageField(upload_to = 'images/' , default= 'images/foto.jpg', verbose_name='upload')
    def save(self, *args, **kwargs):         
        if self.id is not None:
          delete_old_image(Portfoglio, self)
        super(Image, self).save(*args, **kwargs)          

class Team(models.Model):
    name= models.CharField(max_length=200)
    image= models.ImageField(upload_to = 'images/' , default= 'images/foto.jpg', verbose_name='upload')        
    def save(self, *args, **kwargs):         
        if self.id is not None:
          delete_old_image(Team, self)
        super(Team, self).save(*args, **kwargs)

1 个答案:

答案 0 :(得分:0)

from django.db.models.signals import pre_save
from django.dispatch import receiver 

@receiver(pre_save)
def pre_delete_old_image(sender, instance, created, **kwargs):
    if sender not in [Service, Portfoglio, Image, Team]:
        return
    if getattr(sender, 'slug', False):
        instance.slug = slugify(instance.title)
    if not created and getattr(sender, 'image', False):
        delete_old_image(sender, instance)


def delete_old_image(sender, instance):
    try:
        obj = sender.objects.get(id=instance.id)
    except sender.DoesNotExist:
        pass 
    else:
        if obj.image != instance.image:            
            try:
                os.remove(obj.image.path)
            except Exception as e:
                pass