添加过滤更改排序

我有一个我想要添加过滤的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

上一篇: Adding filtering changes ordering

下一篇: "npm faq" fails on Windows 7 ("spawn ENOENT" errors)