двойная перегруппировка в шаблоне Django - PullRequest
0 голосов
/ 03 мая 2011

У меня есть вывод из представления django, который требует некоторой сортировки. Я надеюсь, что я могу сделать это в шаблоне, а не в коде:

в основном, мне нужно представить граф узла / ребра; однако между двумя узлами может быть много ребер (направленных) - поэтому я хочу создать уникальные идентификаторы между ними, чтобы мой json не перезаписывался ('measure1' и 'measure2'):

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
    }
}

так что в основном мне нужен вложенный оператор regroup в for item in source.list только для измерений, которые соответствуют конкретному исходному и целевому узлам в этом цикле; но я не могу заставить его работать. какие-либо предложения?

1 Ответ

0 голосов
/ 03 мая 2011

Я был бы склонен сделать это без использования regroup вообще.Учитывая, что для перегруппировки необходимо, чтобы ваш список был упорядочен с самого начала, я предполагаю, что ваш список уже упорядочен на обоих уровнях.Учитывая это, вы могли бы сделать что-то вроде следующего, используя 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 %}
}
...