Django rest framework 添加筛选更改排序

Django rest framework 添加筛选更改排序,django-rest-framework,Django Rest Framework,我有一个要添加过滤的ModelViewSet。我的简单模型看起来像 class Article(models.Model): date = = models.DateField() language = models.CharField(max_length=10) class Meta: ordering = ['-date'] 以及ModelViewSet(只读): API上的文章现在按日期降序排列,正如我所期望的那样。现在我允许对语言进行过滤。我

我有一个要添加过滤的ModelViewSet。我的简单模型看起来像

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

    class Meta:
        ordering = ['-date']
以及ModelViewSet(只读):

API上的文章现在按日期降序排列,正如我所期望的那样。现在我允许对语言进行过滤。我已在settings.py中将过滤器后端设置为
DjangoFilterBackend
。我更新的ModelViewSet现在看起来像:

class ArticleViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    filter_fields = ['language']
这会将顺序更改为语言ASC。将
order\u by('-date')
添加到queryset不会改变任何内容。添加
ordering=('-date',)
不会改变任何东西。=>如何同时指定筛选和排序(或者在允许筛选时仅使用默认排序)

编辑: 当前功能似乎来自默认情况下在Rest框架中创建的AutoFilterSet: ... 其中,
order\u by=True
以及在django过滤器
get\u ordering\u字段中处理该字段的过程如下:

=>似乎我必须创建一个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

这看起来对吗?保留默认排序似乎有点“太多”/“冗长”。

您可以只添加一个,指定一个
ordering=['-date']
或更好的:
ordering=Article.\u meta.ordering
在您的视图中,恢复丢失的(默认)排序。这还允许用户使用
排序
查询参数覆盖结果的默认排序。

请注意,此问题已在master中解决。。。并将在2.4.3版中发布。

好问题

可以将排序过滤器与Django过滤器结合使用,但我认为过滤器后端应用重新排序函数是不对的


在我的例子中,我必须缓存我的随机查询集,因此我不能再使用Django筛选器,即使我在页面的第一个异步调用中没有进行筛选。

排序是数据库/查询特定的,并且可能是任意的,除非您显式设置顺序。任何面向用户的列表都应该在Article.Meta上设置order-by.Ordering,这在开始筛选之前是受尊重的
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