序列化多个模型并在一个JSON响应中发送所有Django Rest框架

我的目标是返回一个json对象,该对象将用于动态填充html代码中各种select语句中的选项。

所以我想从模型a抓取一个属性,从模型b抓取另一个,依此类推

那么我想要来自属性a和b以及c的所有值

作为键的JSON数组的值,因此

json = {

modelA: {'atter1, atter2, atter3}

modelB: {'atter1, atter2, atter3}

model..:{you get the point}

}

上面引用的帖子的这一部分很有意义:

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

这不是什么:

class TimelineSerializer(serializers.Serializer):

pk = serializers.Field()

title = serializers.CharField()

author = serializers.RelatedField()

pub_date = serializers.DateTimeField()

如何将单独的模型属性设置为正确的json键?

我假设它类似于序列化器关系,但是这些值不是通过一对一,一对一或多对多的方式相互关联的。我只想立即获取所有这些信息,而不是为每个值创建一个api。

我是个迷失的小女孩,我想请你帮助我找到回家的路。

回答:

如果您合理地设计响应格式,则在Django REST Framework中会发现事情变得更容易。

目前似乎有点模糊,但我建议如下:

{

"tweets": [

{"tweet_attr_A": value_1, ...}, // first tweet

{"tweet_attr_A": value_2, ...}, // second tweet

//etc

],

"articles": [

{"id": 1, ...}, // first article

{"id": 2, ...}, // second article

//etc

]

}

我们可以用三个序列化器来表达这一点,例如:

class TweetSerializer(serializers.ModelSerializer):

class Meta:

model = Tweet

class ArticleSerializer(serializers.ModelSerializer):

class Meta:

model = Article

class TimelineSerializer(serializers.Serializer):

tweets = TweetSerializer(many=True)

articles = ArticleSerializer(many=True)

http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-

nested-objects

然后,因为我们使用的模型不止一个,所以最简单的是定义自己的自定义视图集,而不是尝试将其塞入DRF的神奇ModelViewSet类型中。

http://www.django-rest-framework.org/api-

guide/viewsets/#example

首先,我们需要一个对象类型传递给我们的TimelineSerializer。它应该具有两个属性:tweetsarticles

from collections import namedtuple

Timeline = namedtuple('Timeline', ('tweets', 'articles'))

然后,我们将定义自定义视图集以获取推文和文章,实例化一个Timeline对象并返回TimelineSerializer数据:

class TimelineViewSet(viewsets.ViewSet):

"""

A simple ViewSet for listing the Tweets and Articles in your Timeline.

"""

def list(self, request):

timeline = Timeline(

tweets=Tweet.objects.all(),

articles=Article.objects.all(),

)

serializer = TimelineSerializer(timeline)

return Response(serializer.data)

以上是 序列化多个模型并在一个JSON响应中发送所有Django Rest框架 的全部内容, 来源链接: utcz.com/qa/398193.html

回到顶部