我想在JSON中接收上下文时,在序列化第三方包(django-organizations)时遇到问题。
类本身看起来像这样:
class OrganizationUserMixin(OrganizationMixin, JSONResponseMixin):
"""Mixin used like a SingleObjectMixin to fetch an organization user"""
user_model = OrganizationUser
org_user_context_name = 'organization_user'
def get_user_model(self):
return self.user_model
def get_context_data(self, **kwargs):
kwargs = super(OrganizationUserMixin, self).get_context_data(**kwargs)
kwargs.update({self.org_user_context_name: self.object,
self.org_context_name: self.object.organization})
return kwargs
def get_object(self):
""" Returns the OrganizationUser object based on the primary keys for both
the organization and the organization user.
"""
if hasattr(self, 'organization_user'):
return self.organization_user
organization_pk = self.kwargs.get('organization_pk', None)
user_pk = self.kwargs.get('user_pk', None)
self.organization_user = get_object_or_404(
self.get_user_model().objects.select_related(),
user__pk=user_pk, organization__pk=organization_pk)
return self.organization_user
并且我正在尝试将此自定义JSONResponseMixin传递给我的OrganizationUserMixin
类:
class JSONResponseMixin:
"""
A mixin that can be used to render a JSON response.
"""
def render_to_json_response(self, context, **response_kwargs):
"""
Returns a JSON response, transforming 'context' to make the payload.
"""
return JsonResponse(
self.get_data(context),
**response_kwargs
)
def get_data(self, context):
print(context)
return context
然后像这样覆盖render_to_response
中的OrganizationUserMixin
:
def render_to_response(self, context, **response_kwargs):
return self.render_to_json_response(context, **response_kwargs)
如果我打印context
看起来像这样
# {
# 'object': <OrganizationUser: Erik (MyOrgName)>,
# 'organizationuser': <OrganizationUser: Erik (MyOrgName)>,
# 'organization': <Organization: MyOrgName>,
# 'view': <organizations.views.OrganizationUserDetail object at 0x1091a3ac0>,
# 'organization_user': <OrganizationUser: Erik (MyOrgName)>
# }
我收到的错误消息是TypeError: Object of type OrganizationUser is not JSON serializable
如何在JSONResponseMixin中序列化context
?
您在这里有两个选择,可以使用Django rest framework(DRF)或实现对模型执行序列化的功能。
选项1
随着您增加应用程序的API端,DRF是一种更具可持续性的解决方案,因为它可以抽象化大多数反序列化工作,并为您提供许多其他有用的功能,例如路由器,视图集等。
选项2
话虽如此,如果您JsonResponseMixin
足以满足您的大多数需求,并且您的应用程序主要不依赖于API,则可以为模型添加序列化函数并在[C0中调用它们]
示例代码:
JsonResponseMixin.get_data()