多个模型的 Django 休息框架通用视图

Django rest framework generic view for multiple models

有没有一种方法可以创建供多个不同模型使用的通用视图?我的项目中有很多模型,不想为每个模型创建一个视图和序列化程序。

假设这是一个简单的解决方案,但我花了几个小时谷歌搜索没有结果。

在 Django REST 框架 API 指南中 Generic views Examples 显示了以下代码片段:

url(r'^/users/', ListCreateAPIView.as_view(model=User), name='user-list')

这表明这是可能的,但示例似乎不完整(或者我的理解不完整)。

这是我的尝试:

url.py

url(r'^foomodel/', views.GenericViewSet.as_view(model = Foomodel) ),

views.py

class GenericViewSet(generics.ListAPIView):
  model = User # this is over ridden by the url 
  queryset = model.objects.all()
  serializer_class = BaseSerializer
  ordering_fields = '__all__'

serializers.py

class BaseSerializer(serializers.ModelSerializer):
    class Meta:
        model = None

这当然会失败,因为序列化程序不喜欢模型 = None 或我能想到的任何变体。

关于如何解决这个问题有什么建议吗?

一个解决方案是覆盖 ViewSetget_serializer_class 方法。

视图中的 model 字段会很好,因为您在 url 中覆盖它,正如您所说,我要做的是动态构建序列化程序 class .

class GenericViewSet(generics.ListAPIView):
    queryset = model.objects.all()

    def get_serializer_class(self):
        class BaseSerializer(serializer.ModelSerializer):
            class Meta:
                model = self.model
        return BaseSerializer

希望对您有所帮助!

概括一下,目的是创建一个可重复使用的视图,该视图可用于许多模型,而无需重复一堆代码。这在 Django 中留下很少的代码来为许多 Django 模型创建支持 API。我将其用于 ember.js

urls.py

from myapp import models as mymodels
url(r'^cs/(?P<strmodel>[A-Za-z]+)/(?P<id>[0-9]+)/', views.GenericViewSet.as_view({'get': 'retrieve', 'post':'update', 'delete':'destroy' }, application = mymodels ) ),
url(r'^cs/(?P<strmodel>[A-Za-z]+)/', views.GenericViewSet.as_view({'get': 'list','post': 'create' }, application = mymodels ) ),

值得注意的是,我有几个应用程序,并且有一组不同的 URL 可以访问它们。正在访问的模型作为 strmodel

传递

views.py

class GenericViewSet(viewsets.ModelViewSet):

    def __init__(self, application):
        self.application = application

    def initialize_request(self, request, *args, **kwargs):
        self.model = getattr(self.application, self.kwargs['strmodel'] )
        request = super(viewsets.ModelViewSet, self).initialize_request(request, *args, **kwargs)   
        return request

    strmodel = None
    application = None
    model = User
    lookup_field = 'id'

    def get_queryset(self):     
        return self.model.objects.all()

    def get_serializer_class(self):
        class BaseSerializer(serializers.ModelSerializer):      
            class Meta:
                model = self.model
        return BaseSerializer

希望这对您有所帮助:)