gpt4 book ai didi

django-rest-framework - 添加过滤更改排序

转载 作者:行者123 更新时间:2023-12-04 12:32:10 25 4
gpt4 key购买 nike

我有一个要添加过滤的 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 上的文章现在按我预期的日期降序排列。现在我允许过滤语言。我已将过滤器后端设置为 DjangoFilterBackend在settings.py中。我更新后的 ModelViewSet 现在看起来像:
class ArticleViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
filter_fields = ['language']

这会将排序更改为语言 ASC。添加 order_by('-date') to queryset 不会改变任何东西。添加 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

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

最佳答案

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

关于django-rest-framework - 添加过滤更改排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21848095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com