2014-02-18 3 views
7

У меня есть ModelViewSet, к которому я хочу добавить фильтрацию. Моя простая модель выглядитДобавление изменений в настройках фильтрации

class Article(models.Model): 
    date = = models.DateField() 
    language = models.CharField(max_length=10) 

    class Meta: 
     ordering = ['-date'] 

И в ModelViewSet (только для чтения):

class ArticleViewSet(viewsets.ReadOnlyModelViewSet): 
    queryset = Article.objects.all() 
    serializer_class = ArticleSerializer 

Статья по API теперь отсортирована по дате по убыванию, как я бы ожидать. Теперь я разрешаю фильтровать язык. Я установил бэкэнда фильтра на DjangoFilterBackend в settings.py. Обновленный ModelViewSet теперь выглядит так:

class ArticleViewSet(viewsets.ReadOnlyModelViewSet): 
    queryset = Article.objects.all() 
    serializer_class = ArticleSerializer 
    filter_fields = ['language'] 

Это изменяет порядок заказа на язык ASC. Добавление order_by('-date') в queryset ничего не меняет. Добавление ordering = ('-date',) ничего не меняет. => Как указать как фильтрацию, так и порядок (или просто использовать порядок по умолчанию при разрешении фильтрации)?

EDIT: Текущая функциональность, кажется, выходит из AutoFilterSet создан в Rest Framework по умолчанию: https://github.com/tomchristie/django-rest-framework/blob/822eb39599b248c68573c3095639a831ab6df99a/rest_framework/filters.py#L53 ... где order_by=True и передача этого в Джанго фильтре get_ordering_field здесь: https://github.com/alex/django-filter/blob/d88b98dd2b70551deb9c128b209fcf783b325acc/django_filters/filterset.py#L325

=> Кажется, я должен создать класс FilterSet:

class LanguageFilter(django_filters.FilterSet): 
    class Meta: 
     model = Article 
     fields = ['language'] 
     order_by = model()._meta.ordering 

class ArticleViewSet(viewsets.ReadOnlyModelViewSet): 
    queryset = Article.objects.all() 
    serializer_class = ArticleSerializer 
    filter_class = LanguageFilter 

Это выглядит правильно? Кажется немного «много»/verbose, чтобы сохранить заказ по умолчанию.

+0

Заказ представляет собой базу данных/запрос конкретный и потенциально произвольный, если вы явно не задали порядок. Любой пользовательский список должен иметь порядок. – U2EF1

+1

Заказ уже установлен на Article.Meta - который соблюдается до начала фильтрации – toucan

ответ

3

Вместо того чтобы реализовывать свой собственный FilterSet, вы можете вместо этого просто добавьте OrderingFilter, указав ordering = ['-date'] или лучше: ordering = Article._meta.ordering на ваш взгляд, восстановить утраченную (по умолчанию) упорядоченность. Это также позволит вашим пользователям использовать параметр запроса ordering, чтобы переопределить порядок заказов по умолчанию.

0

Хороший вопрос.

Одобрено использовать фильтр заказа в сочетании с Django-фильтром, но я думаю, что это неправильно, так как функция фильтра Backback применяет функцию переупорядочения.

В моем случае я должен кэшировать свой случайный запрос, поэтому я больше не могу использовать Django-Filter, даже если я не фильтрую первый асинхронный вызов страницы.

Смежные вопросы