Django rest framework 添加筛选更改排序
我有一个要添加过滤的ModelViewSet。我的简单模型看起来像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上的文章现在按日期降序排列,正如我所期望的那样。现在我允许对语言进行过滤。我
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