gpt4 book ai didi

django-rest-framework - 用于 Django REST 框架的通用 ModelSerializer

转载 作者:行者123 更新时间:2023-12-05 01:07:03 25 4
gpt4 key购买 nike

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

  • 序列化器通过获取实际的类模型来工作,而无需在序列化器的元类中指定模型
  • 在 DEFAULT_MODEL_SERIALIZER_CLASS 中设置我的序列化器,并让它工作(同样没有在序列化器的 Meta 类中指定模型

  • 它在下面运行良好,但是当我在 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()

    最佳答案

    我找到了一种方法来做到这一点。就是在get_serializer_class函数中动态创建一个类。为了使其通用,我编写了一个从 ModelViewSet 扩展的类,并拥有我将通过 Django REST 框架公开的所有 Multi-Tenancy 感知类,以对其进行子类化。

    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-framework - 用于 Django REST 框架的通用 ModelSerializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19085728/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com