#python #django #django-rest-framework
#python #django #django-rest-framework
Вопрос:
У меня есть URL (urls.py )
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from rds import views
urlpatterns = patterns('',
url(r'^markit/cdxcomposites/$', views.File_List.as_view()),
url(r'^markit/cdxcomposites/(?P<pk>[0-9] )/$', views.File_Detail.as_view()), 'cdxcomposites_date'),
)
urlpatterns = format_suffix_patterns(urlpatterns, allowed=['csv', 'json', 'raw', 'xml', 'yaml'])
И я пытаюсь использовать следующий вид (views.py ) —
class File_List(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = cdx_composites_csv.objects.using('markit').all()
serializer_class = CDX_compositesSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
чтобы иметь возможность фильтровать по полю модели «Дата»
http://localhost:8080/markit/cdxcomposites/?Date=2014-06-26amp;format=xml
Кажется, что фильтр никогда не возвращает все результаты.
Я перепробовал все представленные здесь примеры —
http://www.django-rest-framework.org/api-guide/filtering#overriding-the-initial-queryset
Но, похоже, ничего не происходит. Я пробовал отбрасывать миксины и создавать базовое представление на основе классов, но по-прежнему без кубиков.
Я знаю, что упускаю что-то очевидное, но я не уверен, что.
Например, выполнение самого простого из представлений —
class File_List(generics.ListAPIView):
serializer_class = CDX_compositesSerializer
def get_queryset(self):
"""
This view should return a list of all the purchases for
the user as determined by the username portion of the URL.
"""
Date = self.kwargs['Date']
return cdx_composites_csv.objects.using('markit').filter(Date__Date=Date)
приводит к ошибке —
Ошибка ключа в / markit/cdxcomposites/
‘Дата’
Ответ №1:
Обычно параметры GET передаются в словаре, прикрепленном к объекту запроса. Смотрите документацию по объектам запроса.
Попробуйте:
Date = self.request.GET.get('Date')
Комментарии:
1. очень странно. это сработало, однако мне пришлось изменить мой набор запросов на Date__contains, чтобы он возвращал значение.
Ответ №2:
‘Date’ в вашем случае является не аргументом ключевого слова, а параметром запроса. Я бы сделал это следующим образом:
# first import the needed modules, classes, functions, ...
import re
from django.http import Http404
class File_List(generics.ListAPIView):
serializer_class = CDX_compositesSerializer
def get_queryset(self):
queryset = cdx_composites_csv.objects.using('markit').all()
# get the query parameter or None in case it is empty
date = self.request.QUERY_PARAMS.get('Date', None)
# regex for correct date
regex_date = re.compile(r'^d{4}-d{2}-d{2}$')
# filter your queryset if you really got a correct date
if date is not None and regex_date.match(date):
queryset = queryset.filter(Date__contains=date)
# if there are no results return 404 NOT FOUND
if not queryset:
raise Http404
return queryset
Возможно, есть решения получше, но это должно сработать. Не забывайте всегда проверять вводимые пользователем данные.
Я не знаю вашей модели, но, возможно, вы могли бы реализовать менеджер, который возвращал бы все объекты, используя ‘markit’. Чем вы могли бы получить набор запросов таким образом (просто возможный пример):
queryset = cdx_composites_csv.markit.all()
Здесь ‘markit’ — это атрибут в вашей модели, содержащий ваш пользовательский менеджер:
MarkitManager(models.Manager):
def get_query_set(self):
return Super(MarkitManager, self).get_query_set().using('markit')
Подробнее о фильтрации по параметрам запроса можно найти в официальной документации DRF:
http://www.django-rest-framework.org/api-guide/filtering#filtering-against-query-parameters