Я пытаюсь создать 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']