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

时间:2015-05-12 15:12:28

标签: django-rest-framework

有没有办法创建一个通用视图供几个不同的模型使用?我的项目中有很多模型,并且不想为每个模型创建视图和序列化器。

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

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

print(data[i, info.ravel()])
# array([2, 0, 4])

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

这是我的尝试:

url.py

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

views.py

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

serializers.py

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

因为序列化程序不喜欢model = None或我能想到的任何变体,因此失败了。

有关如何解决此问题的任何建议?

2 个答案:

答案 0 :(得分:1)

解决方案将覆盖ViewSet的{​​{3}}方法。

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

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

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

希望这有帮助!

答案 1 :(得分:1)

回顾一下,目的是创建一个可以用于许多模型的可重用视图,而无需重复一堆代码。这为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

希望这会有所帮助:)