当前位置: 首页 > 知识库问答 >
问题:

Django REST框架的通用ModelSerializer

杨超
2023-03-14

在我的ModelViewSet中,我试图排除我的租户字段,以防止用户看到租户id(来自django-simic-Multitenant)。但是,我不能开发通用的ModelSerializer,因为我总是需要在ModelSerializer类中定义模型Meta。我的源代码,工作(非通用)如下。我想实现以下任一选项:

>

  • 序列化器的工作原理是拾取实际的类模型,而不需要在序列化器的元类中指定模型

    在默认的\u MODEL\u Serializer\u类中设置我的序列化程序,并使其工作(同样,不在序列化程序的元类中指定模型)

    它在下面工作得很好,但是当我在DEFAULT_MODEL_SERIALIZER_CLASS中分配序列化器时,它似乎不起作用。

    class ExcludeTenantSerializer(serializers.ModelSerializer):
        class Meta:
            model = Product
            exclude = ('tenant', )
    
    
    class ProductViewSet(viewsets.ModelViewSet):
        model = Product
        ordering = ('id', )
        serializer_class = ExcludeTenantSerializer
    
        def get_queryset(self):
            tenant = get_current_tenant()
            if tenant:
                return self.model.objects.filter(tenant=tenant)
            else:
                return self.model.objects.none()
    
  • 共有1个答案

    程凯定
    2023-03-14

    我已经找到了这样做的方法。就是在get_serializer_class函数中动态创建一个类。为了使这个通用,我写了一个从ModelViewSet扩展的类,并拥有所有我将通过Django REST框架公开的多租户感知类来子类化它。

    class TenantViewSet(viewsets.ModelViewSet):
        def __init__(self, **kwargs):
            self.serializer_class = None
            super(TenantViewSet, self).__init__(**kwargs)
    
        def get_serializer_class(self):
            if self.serializer_class is not None:
                return self.serializer_class
    
            class ExcludeTenantSerializer(serializers.ModelSerializer):
                class Meta:
                    model = self.model
                    exclude = ('tenant', )
    
            self.serializer_class = ExcludeTenantSerializer
            return self.serializer_class
    
        def get_queryset(self):
            tenant = get_current_tenant()
            if tenant:
                return self.model.objects.filter(tenant=tenant)
            else:
                return self.model.objects.none()
    
     类似资料:
    • 当我要求一个图像http://127.0.0.1:8000/api/images/1/或者传入参数进行裁剪http://127.0.0.1:8000/api/images/1/?height=320 我得到的答复是: 而在http://127.0.0.1:8000/api/images/ 答复是: 为什么缩略图不容易返回主机名,我如何将基本网址追加到响应中? 以下是我的看法。派克

    • 我想我会在这里问这个问题,因为我不太确定我会错在哪里。我正在尝试使用Django Rest框架类通过AJAX执行POST请求。但是,每当事件触发时,我都会收到以下错误: 这是堆栈跟踪中显示的内容: 上下文 我试图做到这一点,当用户单击“添加到列表”按钮时,它会向用户定义的列表发送一个cafeName(以及最终的其他详细信息)。 我想知道是否有人可以看看我的代码,并给我一些指导,我哪里出了问题? 代

    • 本文向大家介绍JSP通用分页框架,包括了JSP通用分页框架的使用技巧和注意事项,需要的朋友参考一下 写一个通用的分页框架,这样在项目里面如果想实现分页功能,只需要稍加改动参数就可以实现分页处理了。这样写了会节省很多时间。 一.分页类 既然要分页那么我们就要考虑建一个通用的分页类,里面需要的参数一般有: 总页数 totalPage 总共记录数 totalRecord 每页显示数 pageSize 当

    • 我正在学习Django和Django REST框架。我正在尝试执行API并添加查看权限。 来自django。db从django导入模型。contrib。auth。模型导入用户 我的模特: 我的连载者: 我的看法: 当我尝试添加新“word”时-显示错误: 序列化程序或视图中存在问题?如何修复?

    • 通用信息系统框架诞生的目的,是帮助企业开发信息系统之初快速搭建起系统基本框架,可以节省精力财力和时间,加快开发进度。 通用信息系统框架包括服务端和客户端两个部分,其中服务端部分完成了整合Spring+Struts2+mybatis技术,客户端包括系统登录,系统主页(其中有菜单展现、多种功能导航、登录用户信息修改等),多种功能导航实现了菜单树、Tab栏、对象树等,以后可以继续丰富,还有通用的权限管理

    • exception$10(errorcode.java:88)在org.axonframework.axonserver.connector.errorcode.convert(errorcode.java:182)在org.axonframework.axonserver.connector.command.command.command.axonservercommandbus$1.onnex