首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django CBV上序列化上下文?

如何在Django CBV上序列化上下文?
EN

Stack Overflow用户
提问于 2020-04-29 10:33:56
回答 1查看 457关注 0票数 2

我在序列化第三方包(django-organizations)时遇到了问题,因为我希望在JSON中接收上下文。

类本身如下所示:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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_responseOrganizationUserMixin形式重写如下:

代码语言:javascript
复制
def render_to_response(self, context, **response_kwargs):
    return self.render_to_json_response(context, **response_kwargs)

如果我打印context

看上去像这样

代码语言:javascript
复制
# {
# '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

如何在我的context中序列化JSONResponseMixin?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-29 13:40:55

这里有两个选项,要么使用Django rest框架 (DRF),要么实现对模型执行序列化的函数。

选项1

DRF是一种更可持续的解决方案,因为您可以扩展应用程序的API端,因为它将抽象大部分反序列化工作,并为您提供许多其他有用的功能,如路由器、ViewSets和其他功能。

示例代码

代码语言:javascript
复制
# serializers.py
from rest_framework import serializers

class OrganizationUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = OrganizationUser
        fields = '__all__'


# views.py
from rest_framework import generics

class OrganizationUser(generics.RetrieveModelMixin):
    queryset = OrganizationUser.objects.all()
    serializer_class = OrganizationUserSerializer

选项2

尽管如此,如果您的JsonResponseMixin足够满足您的大部分需求,并且您的应用程序并不主要依赖于API,那么只需为您的模型添加序列化函数并在您的JsonResponseMixin.get_data()中调用它们即可。

示例代码:

代码语言:javascript
复制
# Models.py
class OrganizationUser(models.Model):
    ...

    def to_json(self):
        # assuming you have a field name and organization
        return {"name": self.name, "organization": self.organization.to_json()}

# mixins.py
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):
        data = {}
        for key, val in context:
            if hasattr(val, "to_json"):
                data[key] = val.to_json()
            else:
                data[key] = val
        return data
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61499749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档