Django REST Framework的通用ModelSerializer

时间:2013-09-30 02:46:52

标签: django-rest-framework

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

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

  2. 在DEFAULT_MODEL_SERIALIZER_CLASS中设置我的序列化程序,让它工作(再次没有在序列化程序的Meta类中指定模型

  3. 它在下面工作得很好,但是当我在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 个答案:

答案 0 :(得分:4)

我找到了一种方法。它是在get_serializer_class函数中动态创建一个类。为了使这个通用,我编写了一个从ModelViewSet扩展的类,并拥有我将通过Django REST Framework公开的所有多租户感知类来继承它。

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()