Python TypeError:应为str、bytes或os.PathLike对象,而不是ImageFieldFile

Python TypeError:应为str、bytes或os.PathLike对象,而不是ImageFieldFile,python,django,file,binary,Python,Django,File,Binary,我正在尝试将文件上载到另一台服务器。我试着这样做: package = Package.objects.get(id=package_id) with open(package.logo_image.image, 'rb') as image_handle: image_data = bytes(image_handle.read()) image = { 'type': 'IMAGE', 'data': ima

我正在尝试将文件上载到另一台服务器。我试着这样做:

 package = Package.objects.get(id=package_id)
 with open(package.logo_image.image, 'rb') as image_handle:
        image_data = bytes(image_handle.read())
        image = {
            'type': 'IMAGE',
            'data': image_data,
            'xsi_type': 'Image'
        }
        logo_image = media_service.upload(image)[0]
模型中的字段:

image = models.ImageField(upload_to=generate_file_path, null=True, blank=True)
尝试运行此代码后,我得到:

打开(package.logo_image.image,'rb')作为图像处理: TypeError:应为str、bytes或os.PathLike对象,而不是ImageFieldFile

转换为str()没有帮助

可以以二进制模式打开此文件吗?
谢谢大家!

您根本不需要打开该文件。ImageField(和FileField)允许您直接访问底层文件对象

package = Package.objects.get(id=package_id)
image_data = bytes(package.logo_image.image.read())

可以打开类型为
ImageField
的关系,以便将文件作为二进制数据读取。对于您的示例,这将使用以下语法:

package.logo_image.image.open(mode='rb')
如果您想使用
ImageField
的图像使用请求模块发布数据,这是一个很有用的例子,例如:

file_list = [
    ('image[data]', (
        'image.jpg',
        package.logo_image.image.open(mode='rb'), 
        'image/jpg')
    ),
]
resp = requests.post(
        "http://example.com/image-ingester"
        files=file_list
 )

这在Django()的
FileField
API文档中进行了描述。

内部内容:
package.logo\u image.image
?从错误中,您应该在
open()
函数中提供图像的路径。错误与您的代码不匹配。它表示您正在进行
package.marketing\u image.image.read()
而不是
打开(package.logo\u image.image)
。这是哪一个?对于pic,我有这样的smt(在django admin中):Image:current:files/vARWl/CdJhO/gEwYBXesCr.jpg我用open做它(软件包…我可以用二进制打开它吗?或者我应该用另一种方式打开它?这不能回答问题。你需要显示实际代码和实际错误,而不是两个不匹配的东西。我用正确的代码图片修复了它