Django Rest Framework对相同的URL和HTTP方法使用不同格式的响应格式

时间:2019-03-10 16:15:36

标签: python django django-rest-framework

我正在使用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')

3 个答案:

答案 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,并根据请求参数使用两个不同的序列化器。