使用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
相关产品推荐
相关产品推荐

