在这里偶然发现了类似的问题。就我而言,列表中的项目可以由用户“检查”。
- 当一个项目被 AJAX 检索到时,它的检查状态作为一个普通字段与资源一起返回。
- 将项目保存到服务器时,资源中的“选中”字段存储在用户会话中。
首先,我认为hydrate()
和dehydrate()
方法是这项工作的最佳匹配,但结果发现request
在这些中访问对象存在问题。所以我选择了alter_data_to_serialize()
and obj_update()
。我认为没有必要 override obj_create()
,因为我认为第一次创建项目时无法检查它。
这是代码,但请注意它尚未经过适当测试。
class ItemResource(ModelResource):
def get_object_checked_status(self, obj, request):
if hasattr(request, 'session'):
session = request.session
session_data = session.get(get_item_session_key(obj), dict())
return session_data.get('checked', False)
return False
def save_object_checked_status(self, obj, data, request):
if hasattr(request, 'session'):
session_key = get_item_session_key(obj)
session_data = request.session.get(session_key, dict())
session_data['checked'] = data.pop('checked', False)
request.session[session_key] = session_data
# Overridden methods
def alter_detail_data_to_serialize(self, request, bundle):
# object > resource
bundle.data['checked'] = \
self.get_object_checked_status(bundle.obj, request)
return bundle
def alter_list_data_to_serialize(self, request, to_be_serialized):
# objects > resource
for bundle in to_be_serialized['objects']:
bundle.data['checked'] = \
self.get_object_checked_status(bundle.obj, request)
return to_be_serialized
def obj_update(self, bundle, request=None, **kwargs):
# resource > object
save_object_checked_status(bundle.obj, bundle.data, request)
return super(ItemResource, self)\
.obj_update(bundle, request, **kwargs)
def get_item_session_key(obj): return 'item-%s' % obj.id