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

使用django-cassandra-engine时如何在Cassandra中存储媒体文件路径

Django 集成 Cassandra 实现类 FileField 存储需求的解决方案

Cassandra 没有内置和 SQL 数据库 FileField 完全对应的字段类型,可根据业务场景选择以下两种实现方案:

方案1:存储文件路径(最常用,适配绝大多数场景)

这个方案逻辑和 SQL 数据库的 FileField 完全一致,数据库仅存文件的索引地址,文件本身存在本地磁盘、NAS 或对象存储服务中:

  • Cassandra 表中新增 text 类型字段,用来存储文件的相对/绝对路径、或者对象存储的访问链接即可。
  • 如果你使用主流的 django-cassandra-engine 集成库,可以自定义字段完全模拟 Django 原生 FileField 的行为,参考实现代码如下:
from django_cassandra_engine.fields import TextField
from django.core.files.uploadedfile import UploadedFile
import os

class CustomCassandraFileField(TextField):
    def __init__(self, upload_to="cassandra_uploads", **kwargs):
        self.upload_to = upload_to
        super().__init__(**kwargs)
    
    def pre_save(self, model_instance, add):
        file_obj = getattr(model_instance, self.attname)
        # 仅当传入的是待上传的文件时执行保存逻辑
        if isinstance(file_obj, UploadedFile):
            # 自定义文件保存逻辑,也可以替换为上传到对象存储的逻辑
            save_path = os.path.join(self.upload_to, file_obj.name)
            with open(save_path, "wb+") as f:
                for chunk in file_obj.chunks():
                    f.write(chunk)
            # 把文件路径存入数据库
            return save_path
        # 已经是路径字符串的话直接返回
        return file_obj

方案2:直接存储文件二进制内容(仅适用于小文件场景)

如果你的业务只需要存储小于1MB的小文件(比如头像、缩略图),可以直接用 Cassandra 的 blob 类型字段存储文件二进制内容,不需要额外的存储服务:

  • 注意 Cassandra 单行数据推荐最大不超过10MB,大文件存 blob 会大幅降低读写性能,且拆分存储的实现复杂度很高,非必要不要用这个方案处理大文件。

实践建议

  • 生产环境优先选择存路径的方案,兼容现有 Django 文件存储生态,维护成本和性能都最优。
  • 如果用对象存储存文件,text 字段直接存对象存储的永久访问地址即可,不需要额外开发文件路由逻辑。
  • 自定义字段时可以直接复用 Django 原生的文件校验、格式判断逻辑,不需要重复造轮子。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:39:04