按MethodSerializer排序

3 投票
1 回答
540 浏览
提问于 2025-04-18 10:06

我有一个序列化器,其中有一个叫做 popular 的方法字段,它返回一个特定的浮点数。有没有办法根据这个序列化器的方法字段来排序呢?

代码片段:

serializers.py

class PostListSerializer(serializers.HyperlinkedModelSerializer):
    popular = serializers.SerializerMethodField('popularity')

    def popularity(self, obj):
        time = datetime.datetime.now()
        n = obj.created.replace(tzinfo=None)
        r = time.replace(tzinfo=None)
        x = r - n
        a = float(str(x.total_seconds()//(60*60*24)))
        view = obj.post.count()
        return view / a

views.py

class PopularPostsSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostListSerializer
    filter_backends = (filters.OrderingFilter,)
    ordering_fields = ('popular')

1 个回答

0

过滤后端是通过改变查询集来工作的。所以它们只适用于数据库中的字段,而不适用于计算得出的字段。

所以我看到有两种可能性:

  • 把人气值存到数据库里,当保存Post或者其他与这个数字相关的数据发生变化时,更新这个值。

  • 自己对结果进行排序。只需在视图集里重写list方法,自己读取排序参数,然后对从父类调用list得到的结果进行排序。

撰写回答