按MethodSerializer排序

时间:2014-06-17 16:57:08

标签: python django rest django-models django-rest-framework

我有一个序列化程序,它有一个受欢迎的方法域,例如它返回一个特定的浮点数。有没有办法通过serializermethodfield订购?

代码段:

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 :(得分:0)

过滤后端基于更改查询集。所以它们只适用于数据库中的字段,而不适用于计算字段。

所以你看到两种可能性:

  • 将流行度放入数据库,在保存Post或其他数据所依赖的数据更改时更新它。

  • 自己对结果进行排序。只需覆盖视图集中的list,自己阅读ordering-argument并对从父级调用list得到的结果进行排序。