У меня есть 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, чтобы сохранить заказ по умолчанию.
Заказ представляет собой базу данных/запрос конкретный и потенциально произвольный, если вы явно не задали порядок. Любой пользовательский список должен иметь порядок. – U2EF1
Заказ уже установлен на Article.Meta - который соблюдается до начала фильтрации – toucan