用于 Django REST 框架的通用 ModelSerializer

Posted

技术标签:

【中文标题】用于 Django REST 框架的通用 ModelSerializer【英文标题】:Generic ModelSerializer for Django REST Framework 【发布时间】:2013-10-05 19:33:41 【问题描述】:

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

    序列化器通过获取实际类模型来工作,无需在序列化器的 Meta 类中指定模型

    在 DEFAULT_MODEL_SERIALIZER_CLASS 中设置我的序列化器,并让它工作(同样没有在序列化器的 Meta 类中指定模型

它在下面运行良好,但是当我在 DEFAULT_MODEL_SERIALIZER_CLASS 中分配 Serializer 时,它似乎不起作用。

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】:

我找到了一种方法来做到这一点。就是在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()

【讨论】:

以上是关于用于 Django REST 框架的通用 ModelSerializer的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest 框架中使用的解析器是啥?

通用视图的 Django REST API 自定义方法

嵌套 url 不适用于 Django REST 框架

django-cors-headers 不适用于 DRF(Django Rest 框架)

C# HttpClient PostAsync 不适用于 django rest 框架

Django REST 框架:令牌身份验证不适用于生产