我有一些django视图的输出需要一些排序。我希望我可以在模板中而不是在代码中执行此操作:
基本上,我需要表示一个节点/边图;但是,两个节点之间可能有很多边缘(有向) - 因此我想在它们之间创建唯一的id,这样我的json就不会被覆盖('measurement1'和'measurement2'):
nodes: {
nodeA: {},
nodeB: {}
},
edges: {
nodeA: {
nodeB: {
measurement1: {},
measurement2: {}
}
}
}
所以我的模型基本上是这样的:
class Measurement( models.Model ):
service = models.ForeignKey( Service, db_index=True )
source_node = models.ForeignKey( Node, related_name='source' )
target_node = models.ForeignKey( Node, related_name='target' )
问题是我的模板目前看起来像这样(它会覆盖json:
"nodes": <blah>
"edges": {
{% regroup measurements by source_node_id as source_list %}
{% for source in source_list %}
"{{ source.grouper }}": {
{% for item in source.list %}
"{{ item.target_node_id }}": {
"id": "{{ item.id }}",
"service_type": "{{ item.service.service_type|lower }}" }{% if not forloop.last %},{% endif %}
{% endfor %}
}{% if not forloop.last %},{% endif %}
{% endfor %}
}
在术语中给出了类似的东西:
edges: {
nodeA: {
nodeB: {
id: measurement1,
service_type: service1
},
nodeB: {
id: measurement2,
service_type: service2
}
}
所以基本上,我需要for item in source.list
内的嵌套regroup语句,只需要与该循环中的特定源节点和目标节点匹配的测量值;但我似乎无法让它发挥作用。有什么建议吗?
答案 0 :(得分:0)
我倾向于在不使用重组的情况下这样做。请记住,重新组合需要先订购您的列表,我假设您的列表已在两个级别订购。鉴于此,您可以使用ifchanged执行类似以下操作,以跟踪自上一次循环迭代以来源和/或目标节点是否已更改。你可能想要修剪一些空格以产生更漂亮的输出:
edges: {
{% for meas in measurements %}
{% ifchanged meas.source_node_id %}
{% if not forloop.first %}
}
},
{% endif %}
{{ meas.source_node_id }}: {
{{ meas.target_node_id }}: {
{% else %}
{% ifchanged meas.target_node_id %}
},
{{ meas.target_node_id }}: {
{% else %}
,
{% endifchanged %}
{% endifchanged %}
measurement{{ meas.id }}: { }
{% if forloop.last %}
}
}
{% endif %}
{% endfor %}
}