我希望在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]
我试图使用这两种观点进行排序'并且'喜欢' VideoListSerializer上的SerializerMethodField就像/ videos / most-viewing /?ordering =' -likes'但似乎没有用。我可以通过那个领域订购任何方式吗?
我已经看过这个问题:Django Rest Framework Ordering on a SerializerMethodField但不知何故,它并没有帮助我解决我的问题。
我还尝试使用带有annotate()方法的Count进行聚合,但我也可以使用字段值,例如' votes'而不是做像votes.likes()这样的事情,这显然是不可能的。
我使用外部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并从中返回命中。
答案 0 :(得分:0)
好的,为了让您知道如何开始,您将不得不深入了解您正在使用的那些包。
据我所知,对于django-hitcount,有一个HitCount模型,其中content_object是你视频的外键。它有一个名为hits的PositiveIntegerField,它包含对象的命中数。因为它是一个外键,你可能需要通过Max或类似的东西来运行它。 有关详细信息,请参阅他们的models.py here。
对于django-vote,你的对象收到的每一次投票都有一个投票类的实例。它还通过GenericForeignKey关系连接到您的Video对象。所以,只要数数那些你就是好的。 有关详细信息,请参阅他们的models.py here。
让我知道它是怎么回事。