使用Django REST框架返回多个模型的结果 [英] Return results from multiple models with Django REST Framework

查看:820
本文介绍了使用Django REST框架返回多个模型的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有三个模型 - 文章,作者和推文。我最终需要使用Django REST框架来构建一个Feed,它将所有使用Article和Tweet模型的对象聚合成一个反向按时间顺序的Feed。



任何想法如何这样做吗我得到了我需要创建一个新的序列化程序的感觉,但我真的不确定。



谢谢!



编辑:这是我迄今为止所做的一切。



app / serializers.py:

  class TimelineSerializer(serializers.Serializer):
pk = serializers.Field()
title = serializers.CharField ()
author = serializers.RelatedField()
pub_date = serializers.DateTimeField()

app / views.py:

  class TimelineViewSet(viewsets.ModelViewSet):

列出rev-chrono中所有推文/文章对象的API端点

queryset = itertools.chain(Tweet.objects.all(),Article。 object.all())
serializer_class = TimelineSerializer


解决方案

p>它看起来非常接近我。我没有亲自在DRF中使用过ViewSets,但是我认为如果你把你的代码改成这个,你应该得到某个地方(对不起 - 没有测试这些):

  class TimelineViewSet(viewsets.ModelViewSet):

列出rev-chrono中所有推文/文章对象的API端点

def list(self,request):
queryset = list(itertools.chain(Tweet.objects.all(),Article.objects.all()))
serializer = TimelineSerializer(queryset,many = True)
返回响应(serializer.data)

如果你不是使用ViewSet,然后一个 generics.ListAPIView 将会更简单一些:

  class TimeLineList(generics.ListAPIView):
serializer_class = TimeLineSerializer

def get_queryset(self):
返回列表(itertools.chain(Tweet.objects.all(),Article .objects.all()))

注意你必须将 chain 的输出转换为列表,以使其正常工作。


I have three models — articles, authors and tweets. I'm ultimately needing to use Django REST Framework to construct a feed that aggregates all the objects using the Article and Tweet models into one reverse chronological feed.

Any idea how I'd do that? I get the feeling I need to create a new serializer, but I'm really not sure.

Thanks!

Edit: Here's what I've done thus far.

app/serializers.py:

class TimelineSerializer(serializers.Serializer):
    pk = serializers.Field()
    title = serializers.CharField()
    author = serializers.RelatedField()
    pub_date = serializers.DateTimeField()

app/views.py:

class TimelineViewSet(viewsets.ModelViewSet):
    """
    API endpoint that lists all tweet/article objects in rev-chrono.
    """
    queryset = itertools.chain(Tweet.objects.all(), Article.objects.all())
    serializer_class = TimelineSerializer

解决方案

It looks pretty close to me. I haven't used ViewSets in DRF personally, but I think if you change your code to this you should get somewhere (sorry - not tested either of these):

class TimelineViewSet(viewsets.ModelViewSet):
    """
    API endpoint that lists all tweet/article objects in rev-chrono.
    """
    def list(self, request):
        queryset = list(itertools.chain(Tweet.objects.all(), Article.objects.all()))
        serializer = TimelineSerializer(queryset, many=True)
        return Response(serializer.data)

If you're not wedded to using a ViewSet then a generics.ListAPIView would be a little simpler:

class TimeLineList(generics.ListAPIView):
    serializer_class = TimeLineSerializer

    def get_queryset(self):
        return list(itertools.chain(Tweet.objects.all(), Article.objects.all()))

Note you have to convert the output of chain to a list for this to work.

这篇关于使用Django REST框架返回多个模型的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆