DRF嵌套序列化无法序列化域名的情况

DRF嵌套序列化无法序列化域名的情况

举例如下

首先我们已经序列化了一个序列化类A

 class ASerializer(serializer.ModelSeializer):
    class Meta:
        model = A
        fields = "__all__"

现在我们需要建立一个序列化类B,在B中有一个字段'a',可以通过序列化A实例来实现字段的应用,当然我们已经提前在做好了外键的相关设置如下

 class A(models.Model):
    b = models.Forignkey(B,related_name="a")

这样我们就能取出某个b下面所有的a了.

所以我们编写了如下的序列化B

 class BSerializer(serializer.ModelSeializer):
    a = ASerializer(many=True)
    class Meta:
        model = B
        field = "__all__"

但是,现在我们会遇到一个问题。

当我们序列化出一个B对象的数据的时候,a这个字段,显示的时A对象序列化后的一个dict。

如果A对象有某个字段,可能是个图片,或者文本字段,它的值是我们设计字段的时候的设计的那个path,如”/media/a/123.png”。

当我们做序列化的时候,DRF的serializer会将域名,和这个路径拼接,返回一个新的字符串,如”http://127.0.0.01:8000/media/a/123.png”这样放在网页上访问的时候,访问的是这个uri的完整路径。就能够获取到图片或者文件数据。

但是,当作为一个字段,嵌套序列化的时候,DRF的serializer是不会做这一件事情的,也就是说,这个字段里面返回的是“/media/a/123.png”
浏览器是无法识别这样的一个路径,也就不会显示出来。

解决
(可能比较拗口)每个model在序列化的时候,都会有一个上下文,这个上下存在类似于一个会话,在序列化类运行的过程中存活。那么我们现在要解决的就是,如何去同步上下文。先看修改后的代码:

  class BSerializer(serializer.ModelSeializer):
    a = ASerializer(many=True,context={"request":self.context["request"]})
    class Meta:
        model = B
        field = "__all__"

我们只做了一件事,更改实例序列化A类的时候中的context上下文中的request字段,使得他的值为序列化类B中的上下文的request字段值。也就是达到上下文一致。这样就解决了这个问题。

将来需要继续探索DRF序列化过程中 上下文的作用与存在形式意义,来解决这个问题的根本

你可能感兴趣的:(django)