首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -将多个行序列化为一个列表

Django -将多个行序列化为一个列表
EN

Stack Overflow用户
提问于 2020-09-11 07:35:12
回答 1查看 222关注 0票数 2

我有三个表顶点,边,图

  1. 顶点可以是许多图的一部分。
  2. 边缘表表示图中任意两个顶点之间的边。

模型

代码语言:javascript
复制
class Graph(models.Model):
    id = models.TextField(
        primary_key=True, null=False)
    name = models.TextField()

class Vertex(models.Model):
    id = models.TextField(
        primary_key=True, null=False)
    name = models.TextField()
    extras = models.JsonField()
 
class Edge(models.Model):
    graph = models.ForeignKey(
        "Graph", related_name="edges")
    node = models.ForeignKey(
        "Vertex", related_name="g_vertex")
    dependency = models.ForeignKey(
        "Vertex", related_name="e_vertex")

串行化

代码语言:javascript
复制
class VertexNameSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vertex
        fields = ['name']

class VertexSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vertex
        fields = ['name', 'extras']


class EdgeSerializer(serializers.ModelSerializer):
    node = VertexSerializer()
    dependency = VertexNameSerializer()

    class Meta:
        model = Edge
        fields = ['node', 'dependency']


class GraphSerializer(serializers.ModelSerializer):
    edges = EdgeSerializer(many=True)

    class Meta:
        model = Graph
        fields = ['id', 'name', 'edges']
        depth = 3

GraphViewSet

代码语言:javascript
复制
class GraphViewSet(viewsets.ModelViewSet):
    queryset = Graph.objects.all()
    serializer_class = GraphSerializer

关于上面的图

表:

代码语言:javascript
复制
+-----+--------------+
| id  |     Name     |
+-----+--------------+
| g-1 | Sample Graph |
+-----+--------------+

Vertex
+-----+------+-------+
| id  | Name | Extra |
+-----+------+-------+
| v-1 | A    | {}    |
| v-2 | B    | {}    |
| v-3 | C    | {}    |
+-----+------+-------+

Edge
+-------+------+------------+
| Graph | Node | Dependency |
+-------+------+------------+
| g-1   | v-1  | null       |
| g-1   | v-2  | null       |
| g-1   | v-3  | v-1        |
| g-1   | v-3  | v-2        |
+-------+------+------------+

因为我有视图集,如果我对/graph端点执行GET调用,这就是我得到的输出

代码语言:javascript
复制
{
  "id": "g-1",
  "name": "Sample Graph",
  "edges": [
    {
      "node": {
        "name": "A",
        "extras": {}
      },
      "dependency": null
    },
    {
      "node": {
        "name": "B",
        "extras": {}
      },
      "dependency": null
    },
    {
      "node": {
        "name": "C",
        "extras": {}
      },
      "dependency": {
        "name": "A"
      }
    },
    {
      "node": {
        "name": "C",
        "extras": {}
      },
      "dependency": {
        "name": "B"
      }
    }
  ]
}

但我想要输出

代码语言:javascript
复制
{
  "id": "g-1",
  "name": "Sample Graph",
  "edges": [
    {
      "node": {
        "name": "A",
        "extras": {}
      },
      "dependency": null
    },
    {
      "node": {
        "name": "B",
        "extras": {}
      },
      "dependency": null
    },
    {
      "node": {
        "name": "C",
        "extras": {}
      },
      "dependency": ["A", "B"]
    }
  ]
}

如何更改序列化程序以获得所需的输出?

EN

回答 1

Stack Overflow用户

发布于 2020-09-11 08:55:25

像这样的东西应该能起作用

代码语言:javascript
复制
class GraphSerializer(serializers.ModelSerializer):
    edges = serializers.SerializerMethodField()

    class Meta:
        model = Graph
        fields = ['id', 'name', 'edges']

    def get_edges(self, obj):
        dependencies_raw = obj.edges.values_list('node__name', 'dependency__name')
        dependencies_mapper = {}
        for node_name, dependency_name in dependencies_raw:
            dependencies_mapper.setdefault(node_name, [])
            dependencies_mapper[node_name].append(dependency_name)

        nodes = EdgeSerializer(obj.edges.distinct('name').all(), many=True).data

        data = [
            {
                **node,
                'dependencies': dependencies_mapper.get(node['node']['name'], None)
            } for node in nodes
        ]
        return data

我现在不能测试。基本上,我会发出两个请求,而不是默认的1。

首先获得node name及其依赖项,第二项获取不同节点的依赖项。那我们就把它粘在一起。

并从dependency字段中删除EdgeSerializer字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63842684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档