在SerializerMethodField

时间:2016-07-03 15:42:40

标签: django django-rest-framework

我希望在SerializerMethodField上订购视频模型。需要完成订购的字段是投票和喜欢,我正在使用其他django包,'投票'和' django-hitcount'。

#models.py
class Video(models.Model, HitCountMixin):
    '''
    Other properties
    '''
    votes = VotableManager()

#serializer.py
class VideoListSerializer(ModelSerializer):
    views = SerializerMethodField()
    likes = SerializerMethodField()
    class Meta:
        model = Video
        fields = [
            'title',
            'views',
            'likes'
        ]

    def get_likes(self, obj):
        return list(Video.objects.get(pk=obj.id).votes.likes()).count(True)

    def get_views(self, obj):
        return Video.objects.get(pk=obj.id).hit_count.hits

#API View for Most Viewed Videos
class VideoMostViewedAPIView(ListAPIView):
    serializer_class = VideoListSerializer
    queryset = Video.objects.all()
    filter_backends = [OrderingFilter]
  1. 我可以使用API​​端点成功订购:/ videos /?ordering = title
  2. get_likes和get_views函数正常工作。
  3. 我试图使用这两种观点进行排序'并且'喜欢' VideoListSerializer上的SerializerMethodField就像/ videos / most-viewing /?ordering =' -likes'但似乎没有用。我可以通过那个领域订购任何方式吗?

    我已经看过这个问题:Django Rest Framework Ordering on a SerializerMethodField但不知何故,它并没有帮助我解决我的问题。

    我还尝试使用带有annotate()方法的Count进行聚合,但我也可以使用字段值,例如' votes'而不是做像votes.likes()这样的事情,这显然是不可能的。

    编辑1

    我使用外部django包来查看和喜欢/不喜欢。因此,votes.likes()实际上返回一个包含true和false的列表。

    例如 - 假设我有一个API调用,

    /api/votes/up/?model=video&id=15&vote=true
    

    然后请求用户将投票选择id = 15的视频模型对象。同样地做

    /api/votes/likes/?model=video&id=15
    

    将返回id = 15的视频模型对象的喜欢和不喜欢,就像在我的序列化器中使用votes.likes()一样。

    另外,由于我只想要喜欢,我列出(instance.votes.likes())。count(True)只计算True的投票(即upvoted)。

    同样,为了计算视图,我使用的模型的hit_count属性不是由我定义的,而是通过添加HitCountMixin并从中返回命中。

1 个答案:

答案 0 :(得分:0)

好的,为了让您知道如何开始,您将不得不深入了解您正在使用的那些包。

据我所知,对于django-hitcount,有一个HitCount模型,其中content_object是你视频的外键。它有一个名为hits的PositiveIntegerField,它包含对象的命中数。因为它是一个外键,你可能需要通过Max或类似的东西来运行它。 有关详细信息,请参阅他们的models.py here

对于django-vote,你的对象收到的每一次投票都有一个投票类的实例。它还通过GenericForeignKey关系连接到您的Video对象。所以,只要数数那些你就是好的。 有关详细信息,请参阅他们的models.py here

让我知道它是怎么回事。