Наткнулся на подобную проблему здесь. В моем случае элементы в списке могут быть «проверены» пользователем.
- Когда AJAX получает элемент, его проверенное состояние возвращается с ресурсом как обычное поле.
- Когда элемент сохраняется на сервере, поле «проверено» ресурса сохраняется в сеансе пользователя.
Сначала я думал, что методы hydrate()
и dehydrate()
лучше всего подходят для этой работы, но оказалось, что в них есть проблемы с доступом к объекту 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