【发布时间】: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 上设置 - 在开始过滤之前一直受到尊重