添加过滤更改排序
我有一个我想要添加过滤的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的文章按照我预期的降序排列。 现在我想让语言过滤。 我已经在settings.py中将过滤器后端设置为DjangoFilterBackend
。 我更新的ModelViewSet现在看起来像:
class ArticleViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
filter_fields = ['language']
这将订单更改为语言ASC。 将order_by('-date')
到queryset不会改变任何内容。 添加ordering = ('-date', )
不会改变任何东西。 =>如何指定过滤和排序(或者在允许过滤的同时简单地使用默认排序)?
编辑:目前的功能似乎来自默认情况下在Rest框架中创建的AutoFilterSet:https://github.com/tomchristie/django-rest-framework/blob/822eb39599b248c68573c3095639a831ab6df99a/rest_framework/filters.py#L53 ... where order_by=True
以及在django-filter 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
这看起来是否正确? 似乎有点“多”/详细保留默认排序。
您可以添加一个OrderingFilter
,在您的视图中指定ordering = ['-date']
或更好: ordering = Article._meta.ordering
,以恢复丢失的(默认)排序,而不是实现自己的FilterSet
。 这也将允许您的用户使用ordering
查询参数来覆盖默认的结果排序。
请注意,这个问题已在master ... https://github.com/tomchristie/django-rest-framework/pull/1836中解决,并且将在2.4.3版本中发布。
好问题。
可以将一个排序过滤器与Django-Filter结合使用,但我认为过滤器后端应用重排序功能是不正确的。
在我的情况下,我不得不缓存我的随机查询集,所以我不能再使用Django-Filter,即使我不是在页面的第一次异步调用时进行筛选。
链接地址: http://www.djcxy.com/p/77473.html