【问题标题】:Adding filtering changes ordering添加过滤更改排序
【发布时间】:2014-02-18 08:33:54
【问题描述】:

我有一个要添加过滤的 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') 添加到查询集不会改变任何内容。添加ordering = ('-date', ) 不会改变任何东西。 => 如何指定过滤和排序(或者在允许过滤的同时使用默认排序)?

编辑: 当前功能似乎来自默认情况下在 Rest Framework 中创建的 AutoFilterSet: https://github.com/tomchristie/django-rest-framework/blob/822eb39599b248c68573c3095639a831ab6df99a/rest_framework/filters.py#L53 ...其中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

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

【问题讨论】:

  • 排序是特定于数据库/查询的,并且可能是任意的,除非您明确设置顺序。任何面向用户的列表都应该有一个排序依据。
  • Ordering 已经在 Article.Meta 上设置 - 在开始过滤之前一直受到尊重

标签: django-rest-framework


【解决方案1】:

与其实现自己的FilterSet,不如添加OrderingFilter,在视图上指定ordering = ['-date'] 或更好:ordering = Article._meta.ordering,以恢复丢失的(默认)排序。这也将允许您的用户使用 ordering 查询参数来覆盖您的默认结果排序。

【讨论】:

    【解决方案2】:

    请注意,此问题已在 master...https://github.com/tomchristie/django-rest-framework/pull/1836 中解决,并将在 2.4.3 版本中发布。

    【讨论】:

      【解决方案3】:

      好问题。

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

      在我的情况下,我必须缓存我的随机查询集,因此我不能再使用 Django-Filter,即使我没有在页面的第一个异步调用时进行过滤。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-02
        • 2014-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多