按MethodSerializer排序
我有一个序列化器,其中有一个叫做 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
得到的结果进行排序。