Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django在模型自定义保存中访问上载的文件,最佳做法?_Python_Django_Models_Filefield_Imagefield - Fatal编程技术网

Python django在模型自定义保存中访问上载的文件,最佳做法?

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/')

我最近一直在试用django

我希望能够通过模型保存功能上的imagemagick运行上传的文件,我意识到这是不可能的,因为在实例保存之前文件不可用

如果在开始时调用save,然后允许访问上传的文件,然后在填充其他字段后重新保存,那么它就可以工作了

有没有更好的方法来实现这一点?两次调用save函数感觉有点不对劲

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)