ここで同様の問題に遭遇しました。私の場合、リスト内の項目はユーザーが「チェック」できました。
- アイテムが AJAX によって取得されると、そのチェック済みステータスがリソースとともに通常のフィールドとして返されます。
- アイテムがサーバーに保存されると、リソースの「チェック済み」フィールドがユーザーのセッションに保存されます。
最初はhydrate()
anddehydrate()
メソッドがこの仕事に最適だと思っていましたがrequest
、これらのオブジェクトへのアクセスに問題があることがわかりました。だから私はと行きましalter_data_to_serialize()
たobj_update()
。アイテムは最初に作成されたときにチェックできないので、オーバーライドする必要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