【问题标题】:optimizing django code model优化django代码模型
【发布时间】:2014-12-28 18:40:01
【问题描述】:

我想优化这段代码。我认为最好的解决方案是使用方法 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)

【问题讨论】:

    标签: django django-models model save


    【解决方案1】:
    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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 2012-12-12
      • 2013-01-22
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多