多个模型的 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 或我能想到的任何变体。
关于如何解决这个问题有什么建议吗?
一个解决方案是覆盖 ViewSet
的 get_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
希望这对您有所帮助:)
有没有一种方法可以创建供多个不同模型使用的通用视图?我的项目中有很多模型,不想为每个模型创建一个视图和序列化程序。
假设这是一个简单的解决方案,但我花了几个小时谷歌搜索没有结果。
在 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 或我能想到的任何变体。
关于如何解决这个问题有什么建议吗?
一个解决方案是覆盖 ViewSet
的 get_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
希望这对您有所帮助:)