有没有办法创建一个通用视图供几个不同的模型使用?我的项目中有很多模型,并且不想为每个模型创建视图和序列化器。
假设这是一个简单的解决方案,但我花了几个小时搜索没有结果。
在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或我能想到的任何变体,因此失败了。
有关如何解决此问题的任何建议?
答案 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
希望这会有所帮助:)