Django缓存含动态属性模型对象失败的解决方案咨询
解决django-stdimage缓存对象时的序列化问题
针对你遇到的缓存Page对象时出现AttributeError: 'StdImageFieldFile' object has no attribute 'thumbnail'的问题,本质是django-stdimage动态生成的variation属性(比如thumbnail)无法被Django缓存的序列化机制正确处理。以下是几种可行的解决方案:
1. 仅加载需要的字段缓存
使用only()方法明确指定要加载的字段,完全排除image字段,确保缓存的对象不包含StdImageField相关内容,从根源避免序列化问题:
page = Page.objects.only('name').get(pk=1) cache.set("page", page, None)
相比defer(),only()会严格限制加载的字段,能确保image字段不会被加载到对象中,规避了defer可能存在的字段隐式加载问题。
2. 转换为字典缓存
将模型对象转换为字典,排除image字段后再缓存,这种方式灵活性更高,适合不需要完整模型对象方法的场景:
from django.forms.models import model_to_dict page = Page.objects.get(pk=1) page_dict = model_to_dict(page, exclude=['image']) cache.set("page", page_dict, None) # 从缓存取出时,若需要模型对象可重新构建 cached_page_dict = cache.get("page") page = Page(**cached_page_dict)
3. 使用Django序列化器缓存
通过Django的序列化工具,仅序列化需要的字段,缓存序列化后的字符串,取出时再反序列化为模型对象:
from django.core.serializers import serialize, deserialize # 序列化时指定仅包含name字段 page = Page.objects.get(pk=1) serialized_data = serialize('json', [page], fields=('name',)) cache.set("page", serialized_data, None) # 从缓存取出并反序列化为模型对象 cached_data = cache.get("page") page = list(deserialize('json', cached_data))[0].object
以上三种方法都能实现缓存需求,你可以根据实际业务场景选择合适的方式。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

