Python 如何从两个序列化程序创建自定义输出JSON

Python 如何从两个序列化程序创建自定义输出JSON,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,我是Django Rest框架的新手,我有一个练习。我想从两个Django模型创建自定义JSON输出。我已经创建了两个序列化视图。输出JSON应该是: { "movie_id": 2, "total_comments": 4, "rank": 1 }, { "movie_id": 3, "total_comments": 2, "rank": 2 }, { "movie_id": 4, "total_comm

我是Django Rest框架的新手,我有一个练习。我想从两个Django模型创建自定义JSON输出。我已经创建了两个序列化视图。输出JSON应该是:

{

    "movie_id": 2,

    "total_comments": 4,

    "rank": 1

},

{

    "movie_id": 3,

    "total_comments": 2,

    "rank": 2

},

{

    "movie_id": 4,

    "total_comments": 2,

    "rank": 2

}
并且GET/top url应该:

  • ​应根据在指定日期范围内添加到电影(如示例所示)的评论数,返回数据库排名中已出现的顶级电影。响应应包括电影ID、排名位置和评论总数(在指定的日期范围内)

  • 评论数相同的电影在排行榜上应该有相同的位置

  • 应要求指定应生成统计信息的日期范围

我有两个序列化程序:

class CommentSerializer(serializers.ModelSerializer):
   class Meta:
      model= Comment
      fields=('movie','user','timestamp','content','approved')
class MovieSerializer(DynamicFieldsModelSerializer,serializers.HyperlinkedModelSerializer):
     comments=CommentSerializer(many=True)
     comments=None

    class Meta:
        model = Movie

        fields = ('id','name','description','year','released','comments','rating')
这是评论模式:

class Comment(models.Model):
     movie = models.ForeignKey(Movie, on_delete=models.DO_NOTHING,related_name='comments',blank=True,null=True)
    content = models.TextField()
    timestamp = models.DateTimeField(default=timezone.now)
    user=models.CharField(max_length=250)
我试着用这个技巧自己做到这一点:

class MovieViewSet(viewsets.ModelViewSet):

      queryset = Movie.objects.all()
      serializer_class = MovieSerializer

class CommentViewSet(viewsets.ModelViewSet):
      queryset = Comment.objects.all()
      serializer_class = CommentSerializer
class TopViewSet(viewsets.ModelViewSet):
      serializer_class = MovieSerializer
      #queryset = Movie.objects.annotate(comment_count=(Count('comments'))).order_by("-comment_count","-rating")
       queryset = Movie.objects.all().annotate(comment_count=(Count('comments'))).order_by("-comment_count")
但我不知道如何创建定制的JSON输出


如果有人能在最后一点,即日期方面帮助我,我将不胜感激。

我认为您应该重写您认为的get方法:

来自rest\u framework.response导入响应
从rest\u框架导入状态
类MovieViewSet(viewsets.ModelViewSet):
queryset=Movie.objects.all()
序列化程序\u class=MovieSerializer
def get(自我):
“做点什么”
输出={{
“电影id”:2,
“总评论”:4,
“排名”:1
},
{
“电影id”:3,
“总评论”:2,
“排名”:2
},
{
“电影id”:4,
“总评论”:2,
“排名”:2
}
}
返回响应(输出,状态=status.HTTP\u 200\u OK)
有关更多详细信息,请参阅DRF文件:
我想你可以这样做:

# serializer
class MovieSerializer(HyperlinkedModelSerializer):
     comments = CommentSerializer(many=True)
     comments_count = serializer.IntegerField()
     rank = serializer.IntegerField()

    class Meta:
        model = Movie
        fields = ('id','name','description','year','released','comments','rating', 'comments_count', 'rank')

# Viewset

from django.db.models import Sum, F
from django.db.models.expressions import Window
from django.db.models.functions import Rank


class TopViewSet(viewsets.ModelViewSet):
      serializer_class = MovieSerializer
      queryset = Movie.objects.all()

       def get_queryset(self, *args, **kwargs):
          from_date = self.request.query_params.get('from_date')
          to_date = self.request.query_params.get('to_date')
          movies = super(ToViewSet, self).get_queryset()
          if from_date and to_date:
               movies = movies.filter(release__range=[from_date, to_date])
          return movies.annotate(comment_count=Count('comments'), rank=Window(expression=Rank(), order_by=F('comments').desc()),)
说明: 在
get\u queryset()
方法中,我使用了。这是用来得到的。因此,当您从2018-01-01和2019-01-31调用
/your\u url/?时,它将过滤给定日期范围之间的查询集

此外,我还使用Django模型来注释对象的等级


最后,在序列化程序中,我在
serializer
中添加了两个额外字段。它将从queryset中捕获带注释的值并显示为输出。

我不知道我们是否相互理解,但问题是我不知道如何组合这两个模型来创建自定义JSON输出。REST API应该创建一个排行榜,我认为应该统计评论,并根据大量评论和指定的日期范围呈现排名。@KrzysiekPerkowski您的模型中有这种关系吗?是的,评论模型中有外键我的关系有问题吗?你能解释一下吗?非常感谢你的帮助。你能上传你的结果吗?你是我的救星,但我还有最后一个小问题。我试图实现您的代码,但我认为这行代码中有语法错误:return movies.annotate(comment_count=count('comments')、rank=Window(expression=rank()、order_by=F('comments')。asc()),语法接近“(”RawErrorCode:嗯,我在本地机器上运行了我的代码,但没有遇到任何问题。您能检查一下它的制表符/空格转换问题,或者是否遗漏了任何括号:)?您能只给我发送views.py文件吗?请注意,这是sqlite 3数据库的问题。非常感谢,你是最棒的。不客气。顺便说一句,你可以标记,这可能会在将来帮助别人。