Python django在模型自定义保存中访问上载的文件,最佳做法?
我最近一直在试用django 我希望能够通过模型保存功能上的imagemagick运行上传的文件,我意识到这是不可能的,因为在实例保存之前文件不可用 如果在开始时调用save,然后允许访问上传的文件,然后在填充其他字段后重新保存,那么它就可以工作了 有没有更好的方法来实现这一点?两次调用save函数感觉有点不对劲Python django在模型自定义保存中访问上载的文件,最佳做法?,python,django,models,filefield,imagefield,Python,Django,Models,Filefield,Imagefield,我最近一直在试用django 我希望能够通过模型保存功能上的imagemagick运行上传的文件,我意识到这是不可能的,因为在实例保存之前文件不可用 如果在开始时调用save,然后允许访问上传的文件,然后在填充其他字段后重新保存,那么它就可以工作了 有没有更好的方法来实现这一点?两次调用save函数感觉有点不对劲 class uploadedFiles(models.Model): orignal_image = models.FileField(upload_to='userimages/')
class uploadedFiles(models.Model):
orignal_image = models.FileField(upload_to='userimages/')
user = models.ForeignKey(User)
description = models.TextField(blank=True)
def __unicode__(self,force_insert=False, force_update=False):
return "%s uploaded by %s" % (self.orignal_image.path, self.user)
def save(self, force_insert=False, force_update=False):
super(uploadedFiles, self).save()
s = ''
cmd = subprocess.Popen(['identify', '-verbose', self.orignal_image.path], stdout=subprocess.PIPE)
for line in cmd.stdout:
s += line
self.description = s
super(uploadedFiles, self).save()
使用Django的
pre_save
signal(,另请参见Django文档):
Django现在将在保存
MyModel
对象之前调用do\u something
。最好使用图像库函数来收集图像元数据。然后您只需从image字段的FileStorage
实例中读取图像数据。只要检查一下有没有问题。此外,当使用Django的ImageField
时,它会检查上载的文件是否为有效的图像文件,检查ImageField
的代码作为基线,以获取有关图像的更多信息
我将为模型定义一个clean
方法,它将在调用模型的save
方法之前被调用。在clean
中,然后使用PIL函数检查图像字段的数据流,以获取元数据(或您想要用于此目的的任何库,只要它接受数据流,而不是物理文件),然后用元数据填充描述字段
使用Django的存储API更好,因此您可以从云中存储的文件(如AmazonS3)中提取元数据,而不仅仅是那些存储在本地文件系统中的文件,从而使代码在部署中更具可移植性
from django.db.models.signals import pre_save
from myapp.models import MyModel
def do_something(sender, **kwargs):
pass
pre_save.connect(do_something, sender=MyModel)