django — фильтрация ответов на URL-адреса

#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