我正在使用Django Rest Framework处理应用程序,并且使用 django-rest-framework-datatables 插件来帮助我处理对数据表的分页。
工作正常,但是当我请求一个寄存器时,它不断为我提供数据表的json格式,如下所示:
{
"count": 1,
"next": null,
"previous": null,
"results": [{
"id": 1,
"name": "University of Passo Fundo",
"country": "Brazil"
}]
}
这不是大问题,但是我希望只接收结果字段。如何在django rest框架中检查请求参数,如何为相同的URL和相同的方法定义两种不同的响应格式?
遵循我的代码:
urls.py
router = routers.DefaultRouter()
router.register(r'institution', InstitutionViewSet, base_name='Institution')
urlpatterns = [
path('admin/', admin.site.urls),
path('api-auth/', include('rest_framework.urls')),
# api
path('api/', include(router.urls)),
# views
url(r'^$', Home.as_view(), name='index'),
url(r'institution/', Institution.as_view(), name='institution'),
]
serializer.py
class InstitutionSerializer(serializers.ModelSerializer):
class Meta:
model = Institution
fields = '__all__'
datatables_always_serialize = ('id', 'name', 'country')
models.py
class Institution(models.Model):
id = models.AutoField(db_column='id', primary_key=True)
name = models.CharField(db_column='name', max_length=255, null=False)
country = models.CharField(db_column='country', max_length=255, null=False)
class Meta:
db_table = 'Institution'
managed = True
verbose_name = 'Institutions'
verbose_name_plural = 'Institutions'
ordering = ['id']
def __str__(self):
return self.name
views.py
class InstitutionViewSet(viewsets.ModelViewSet):
serializer_class = InstitutionSerializer
def get_queryset(self):
if 'type' in self.request.GET and self.request.GET['type'] == 'edit':
return Institution.objects.filter(id=self.request.GET['id'])
return Institution.objects.all().order_by('id')
答案 0 :(得分:1)
首先,这就是Django渲染分页响应的方式。 因此,您可以根据页面查看下一个或上一个项目列表。
第二,您应该覆盖Django的列表视图,如下所示:
class InstituttionViewSet(viewsets.ModelViewSet):
serializer_class = InstitutionSerializer
pagination_class = None
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
在这里,我们将覆盖list方法,该方法负责呈现项目API列表。因此,它将首先获取queryset
中的所有项目,然后将其传递给序列化器以将其写入特定格式,最后返回在json中列出的响应。
此外,请记住,我还设置了pagination_class=None
,因此Django将不再对API使用分页。
答案 1 :(得分:0)
我认为您不应覆盖get_queryset
视图的方法,这应该可以解决您的问题。 drf views默认通过retrieve
方法处理默认参数。您可以使用自己的pagination class编辑响应模式。
答案 2 :(得分:0)
您可以覆盖方法get_serializer_class,并根据请求参数使用两个不同的序列化器。