django остальные рамки создают json и csv api - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь создать 2 API. 1 для доступа к json с помощью ajax datatable, а другой для создания кнопки csv экспорта.

API-интерфейс json, который мне удается создать и получить из него данные с помощью ajax, но у меня возникают проблемы, когда я пытаюсь получить доступ к API-интерфейсу в браузере, а другой - добавить API-интерфейс CSV. Я покажу вам часть моего скрипты и ошибки, которые я получаю.

views.py

class VideoViewSet(viewsets.ModelViewSet):
    queryset = DatamsVideos.objects.all()
    serializer_class = VideosSerializer

    parser_classes = (CSVParser,) + tuple(api_settings.DEFAULT_PARSER_CLASSES)
    renderer_classes = (CSVRenderer,) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)

    def list(self, request, **kwargs):
        try:
            vs = query_vs_by_args(**request.query_params)
            serializer = VideosSerializer(vs['items'], many=True)
            result = dict()
            result['data'] = serializer.data
            result['draw'] = vs['draw']
            result['recordsTotal'] = vs['total']
            result['recordsFiltered'] = vs['count']
            return Response(result, status=status.HTTP_200_OK, template_name=None, content_type=None)

        except Exception as e:
            return Response(e, status=status.HTTP_404_NOT_FOUND, template_name=None, content_type=None)

    def get_renderer_context(self):
        context = super(VideoViewSet, self).get_renderer_context()
        context['header'] = (
            self.request.GET['fields'].split(',')
            if 'fields' in self.request.GET else None)
        return context

    @action(methods=['GET'], detail=False)
    def bulk_upload(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data, many=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_303_SEE_OTHER, headers={'Location': reverse('videos-api')})

urls.py

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'videos', VideoViewSet)

urlpatterns = [
    url(r'^$', index, name='main'),
    url(r'^api/', include(router.urls)),
]

и это часть моего models.py

def query_vs_by_args(**kwargs):
    draw = int(kwargs.get('draw', None)[0])
    length = int(kwargs.get('length', None)[0])
    start = int(kwargs.get('start', None)[0])
    search_value = kwargs.get('search[value]', None)[0]
    order_column = kwargs.get('order[0][column]', None)[0]
    order = kwargs.get('order[0][dir]', None)[0]

    order_column = ORDER_VS_COLUMN_CHOICES[order_column]
    # django orm '-' -> desc
    if order == 'desc':
        order_column = '-' + order_column

    queryset = DatamsVideos.objects.all()
    total = queryset.count()

    if search_value:
        queryset = queryset.filter(Q(link__icontains=search_value) |
                                   Q(title__icontains=search_value) |
                                   Q(views__icontains=search_value) |      Q(date_added__icontains=search_value))                                         

    count = queryset.count()
    queryset = queryset.order_by(order_column)[start:start + length]
    return {
        'items': queryset,
        'count': count,
        'total': total,
        'draw': draw
    }

1 проблемы, с которой я столкнулся, связана с функцией list из views.py at

vs = query_vs_by_args(**request.query_params)
serializer = VideosSerializer(vs['items'], many=True)

Мне все еще удается получить данные из него с помощью ajax, но когда я пытаюсь получить доступ к API в браузере / main / api / videos / , это выдает мне эту ошибку:

   HTTP 404 Not Found
Allow: GET, POST, HEAD, OPTIONS
Content-Type: text/csv ;utf-8
Vary: Accept

""
'NoneType' object has no attribute '__getitem__'

То же самое, когда я пытаюсь получить доступ к / main / api / videos /? Format = json

TypeError("'NoneType' object has no attribute '__getitem__'",) is not JSON serializable

Когда я пытаюсь получить CSV из / main / api / videos /? Format = csv , это говорит мне Файл не найден

Возможно, мне не хватает некоторых деталей, просто не дайте мне знать, если вам нужна дополнительная информация.

Заранее спасибо

UPDATE Теперь я просто понимаю, если я прокомментирую функцию list API работает нормально ... но мой AJAX больше не работает, потому что у меня нет 4 необходимых вещей для сборки JSON

    result['data'] = serializer.data
    result['draw'] = ch['draw']
    result['recordsTotal'] = ch['total']
    result['recordsFiltered'] = ch['count']

1 Ответ

0 голосов
/ 03 мая 2018

Мне удалось исправить проблему csv и api, разделив классы.

class VideoCSVExportView(viewsets.ModelViewSet):
    queryset = DatamsPornhubVideos.objects.all()
    serializer_class = VideosSerializer

    renderer_classes = (CSVRenderer,) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)

После того, как я создаю этот новый класс для CSV, я помещаю его в другой маршрут.

csv_router = DefaultRouter()
csv_router.register(r'videos', VideoCSVExportView)

...
    url(r'^csv/', include(csv_router.urls)),
..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...