Django Rest Framework другой формат ответа для одного и того же URL и метода HTTP - PullRequest
0 голосов
/ 10 марта 2019

Я работаю над приложением, использующим Django Rest Framework для обработки запросов, и использую плагин django-rest-framework-datatables , помогающий обрабатывать нумерацию страниц.

Работает нормально,но когда я запрашиваю один регистр, он продолжает приносить мне формат json для таблиц данных, например:

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [{
        "id": 1,
        "name": "University of Passo Fundo",
        "country": "Brazil"
    }]
}

Это не большая проблема, но я бы предпочел получить только поле результата.Как я могу определить два разных формата ответа для одного и того же URL и одного и того же метода, просто проверяя параметры запроса в django rest framework?

Следуйте моему коду:

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

просмотров.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 ]

1 голос
/ 10 марта 2019

Прежде всего, именно так 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.

0 голосов
/ 10 марта 2019

Вы можете переопределить метод, get_serializer_class и использовать два разных сериализатора в зависимости от параметра запроса.

0 голосов
/ 10 марта 2019

Я думаю, вы не должны переопределять get_queryset метод представления, это должно решить вашу проблему. представления drf обрабатывают параметры по умолчанию по умолчанию с помощью метода retrieve. Вы можете использовать свой собственный класс разбиения на страницы для редактирования схемы ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...