我有三个表顶点,边,图
模型
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")串行化
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 = 3GraphViewSet
class GraphViewSet(viewsets.ModelViewSet):
queryset = Graph.objects.all()
serializer_class = GraphSerializer关于上面的图

表:
+-----+--------------+
| 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调用,这就是我得到的输出
{
"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"
}
}
]
}但我想要输出
{
"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"]
}
]
}如何更改序列化程序以获得所需的输出?
发布于 2020-09-11 08:55:25
像这样的东西应该能起作用
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字段。
https://stackoverflow.com/questions/63842684
复制相似问题