• 28 Янв
  • 2016
Как использовать Primary Key для upload_to

Приведем простой пример, который будет загружать изображение при сохранении инстанса модели и использовать Primary Key в качестве имени файла.


class Image(models.Model):
    path = models.ImageField(upload_to='temp', null=True, blank=True)
    caption = models.CharField(max_length=256, blank=True)
    created = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return str(self.pk)

    def save(self, *args, **kwargs):
        super(Image, self).save(*args, **kwargs)

        path = self.path
        if path:
            oldfile = self.path.name
            newfile = str(self.pk) + oldfile[oldfile.rfind('.'):]
            if newfile != oldfile:
                self.path.storage.delete(newfile)
                self.path.storage.save(newfile, path)
                self.path.name = newfile
                self.path.close()
                self.path.storage.delete(oldfile)
        super(Image, self).save(*args, **kwargs)

 Теперь при сохранении инстанса будет срабатывать переопределенный метод save(), который прежде будет сохранять объект в базу, а после уже использовать instance.pk для сохранения файла. При этом первоначально файл будет сохраняться в /media/temp/, а после в /media/, но уже с именем типа 8,jpg.

comments powered by Disqus