5 python django rest json django-rest-framework
这个问题被要求扩展并填补这个漏洞:使用Django REST Framework从多个模型返回结果
我的目标是返回一个json对象,我将用它来动态填充我的html代码中各种select语句中的选项.
所以我想从模型a中获取属性,从模型b中获取另一个属性
然后我想要属性a和b以及c等的所有值
作为一个json数组的值,所以
json = {
modelA: {'atter1, atter2, atter3}
modelB: {'atter1, atter2, atter3}
model..:{you get the point}
}
Run Code Online (Sandbox Code Playgroud)
上面引用的帖子中的这一部分是有道理的:
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
Run Code Online (Sandbox Code Playgroud)
什么不是这个:
class TimelineSerializer(serializers.Serializer):
pk = serializers.Field()
title = serializers.CharField()
author = serializers.RelatedField()
pub_date = serializers.DateTimeField()
Run Code Online (Sandbox Code Playgroud)
如何将单独的模型属性设置为正确的json键?
我认为它类似于一个串行关系的东西,但这些价值不是通过onetoone,一对多,或许多与海誓山盟很多.我只是想立即获取所有这些信息,而不是为每个值创建一个api.
我是一个迷失的小女孩,我请你帮我找回家的路.拥抱和亲吻.
Ane*_*pic 26
如果您合理地设计响应格式,您将在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
]
}
Run Code Online (Sandbox Code Playgroud)
我们可以用三个序列化器来表达这一点,例如:
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)
Run Code Online (Sandbox Code Playgroud)
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,它有两个属性:tweets
和articles
from collections import namedtuple
Timeline = namedtuple('Timeline', ('tweets', 'articles'))
Run Code Online (Sandbox Code Playgroud)
然后我们将定义自定义视图集以获取推文和文章,实例化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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8173 次 |
最近记录: |