如何让Django createcachetable生成的缓存表使用自定义timestamp(0)字段
给Django数据库缓存表用timestamp(0)时间戳的方法
你已经写好了自定义的DateTimeWithoutTZField,要把它用到createcachetable创建的缓存表里,得重写Django默认的数据库缓存后端逻辑,具体操作如下:
1. 编写自定义数据库缓存后端
在项目里找个合适的位置(比如新建cache_utils.py文件),继承默认的数据库缓存后端类,并重写表创建逻辑,把默认日期字段替换成你的自定义字段:
from django.core.cache.backends.db import DatabaseCache from django.db import models from django.utils.timezone import now # 导入你之前定义的自定义字段,替换成实际的文件路径 from your_app.models import DateTimeWithoutTZField class CustomDBCache(DatabaseCache): def _create_table(self): # 定义缓存表的模型结构,将expires字段替换为自定义的DateTimeWithoutTZField class CacheEntry(models.Model): cache_key = models.CharField(max_length=255, primary_key=True) value = models.TextField() expires = DateTimeWithoutTZField(default=now) class Meta: db_table = self._table managed = False # 使用这个自定义模型创建缓存表 with self.connection.schema_editor() as editor: editor.create_model(CacheEntry)
2. 修改settings中的缓存配置
打开settings.py,把默认的数据库缓存后端替换为你刚编写的自定义类:
CACHES = { 'default': { 'BACKEND': 'your_project.cache_utils.CustomDBCache', # 替换为你的实际文件路径 'LOCATION': 'my_cache_table', # 填写你要创建的缓存表名称 } }
3. 创建自定义缓存表
现在运行createcachetable命令,就会基于自定义字段生成缓存表了:
python manage.py createcachetable my_cache_table
注意事项
- 如果之前已经创建过默认缓存表,需要先删除旧表再重新执行创建命令,否则字段类型不会更新。
- 确保自定义字段的导入路径正确,避免出现找不到类的错误。
- 这个自定义后端仅修改了表创建时的字段类型,其余缓存逻辑和默认数据库缓存完全一致,不影响原有缓存功能。
内容的提问来源于stack exchange,提问作者Marcos DaSilva
相关产品推荐
相关产品推荐

