You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django项目升级psycopg2至psycopg3后bytea图片无法渲染

解决psycopg3升级后Django bytea图片无法渲染的问题

问题根源

psycopg3对PostgreSQL的bytea类型默认返回bytes对象,而psycopg2返回的是memoryview。memoryview支持类文件的read()接口,能直接被Django的FileResponse处理;但bytes不具备该接口,导致响应无法正确渲染图片。

解决方案1:视图层转换为类文件对象

在返回响应前,将bytes转换为BytesIO(类文件对象),让FileResponse可以正常处理:

from django.http import FileResponse
import io

def person_picture_view(request):
    person = Person.objects.get(pk=1)
    # 将bytes转为BytesIO对象
    image_stream = io.BytesIO(person.picture)
    # 可选:指定图片Content-Type,比如image/jpeg、image/png
    return FileResponse(
        image_stream,
        as_attachment=True,
        content_type="image/jpeg",
        filename="avatar.jpg"
    )

解决方案2:模型字段层面适配

自定义字段自动转换bytea返回值,避免修改所有视图:

from django.db import models
import io

class ByteaImageField(models.BinaryField):
    def from_db_value(self, value, expression, connection):
        if value is None:
            return value
        # 将bytes转为BytesIO,也可以用memoryview(value)
        return io.BytesIO(value)

# 模型中使用自定义字段
class Person(models.Model):
    picture = ByteaImageField()

之后视图可以继续使用原有代码:

return FileResponse(person.picture, as_attachment=True)

额外验证点

  • 确认图片的Content-Type设置正确,否则浏览器可能无法识别图片格式
  • 如果图片存储时包含额外元数据,需确保转换过程中未丢失数据

内容的提问来源于stack exchange,提问作者SaeX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:29:57