当前位置: 首页 > 面试题库 >

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

陆俊迈
2023-03-14
问题内容

有人问这个问题,以扩大并填补这个问题:使用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}
}

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

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对象,该对象将用于动态填充html代码中各种select语句中的选项。 所以我想从模型a抓取一个属性,从模型b抓取另一个,依此类推 那么我想要来自属性a和b以及c的所有值 作为键的JSON数组的值,因此 上面引用的帖子的这一部分很有意义: 这不是什么: 如何将单独的模型属性设置为正确的json键? 我假设它类似于序列化器关系,但是这些值不是通过一对一,一对一或

  • 当我要求一个图像http://127.0.0.1:8000/api/images/1/或者传入参数进行裁剪http://127.0.0.1:8000/api/images/1/?height=320 我得到的答复是: 而在http://127.0.0.1:8000/api/images/ 答复是: 为什么缩略图不容易返回主机名,我如何将基本网址追加到响应中? 以下是我的看法。派克

  • 问题内容: 我是Django REST框架的初学者,需要你的建议。我正在开发Web服务。该服务必须提供与其他服务的REST接口。我需要实现的REST接口无法直接与我的模型一起使用(我的意思是获取,放置,发布,删除操作)。相反,它为其他服务提供了一些计算结果。根据请求,我的服务会进行一些计算,只是将结果返回(不将结果存储在自己的数据库中)。 以下是我对如何实现REST接口的理解。纠正我,如果我错了。

  • 我是Django REST框架的初学者,需要您的建议。我正在开发一个web服务。该服务必须向其他服务提供REST接口。我需要实现的REST接口并不直接与我的模型一起工作(我指的是get、put、post和delete操作)。取而代之的是,它向其他服务提供一些计算结果。在一个请求中,我的服务进行一些计算并返回结果(不将结果存储在自己的数据库中)。 下面是我对如何实现REST接口的理解。纠正我,如果我

  • 问题内容: 我正在实现一个支持部分响应的Web API。 给定班级用户 序列化所有属性时,Json格式化程序效果很好,但是我无法在运行时对其进行修改以告诉它忽略某些属性,具体取决于查询参数“字段”。 我正在使用JsonMediaTypeFormatter。 为了自定义格式化程序,我遵循了http://tostring.it/2012/07/18/customize-json-result-in-w

  • 问题内容: 我想反序列化JSON(使用Jackson 1.9.11和RestTemplate 1.0.1),其中一个字段可能具有更多类型含义,例如: 要么 一个或另一种情况对于一个特定类型的设置器(String od custom Response类)都可以正常工作,但是当我将实体bean重写的设置器放入能够处理这两种情况时,将引发异常: 我当时在考虑三种解决方案,但没有任何一种可行: 仅使用St