J'ai ce modèle :
class Connection(models.Model):
CONNECTION_CHOICES = [
('REST-API', 'REST-API'),
('SSH', 'SSH'),
('SFTP', 'SFTP'),
('SOAP-API', 'SOAP-API'),
]
endpoint = models.CharField(max_length=240, blank=True, null=True)
port = models.IntegerField(blank=True, null=True)
connection_type = models.CharField(max_length=240, choices=CONNECTION_CHOICES)
source_tool = models.ForeignKey(Tool, on_delete=models.CASCADE, related_name='source-tool+')
target_tool = models.ForeignKey(Tool, on_delete=models.CASCADE, related_name='target-tool+')
def __str__(self):
return self.source_tool.name + " à " + self.target_tool.name
def get_absolute_url(self):
return reverse('tools:connection-detail', kwargs={'pk': self.pk})
Dans une vue, j'essaie de combiner des objets, où source_tool et target_tool sont les mêmes, mais le connection_type diffère.
Actuellement, j'ai cette vue :
def api_map_view(request):
json = {}
nodes = []
links = []
connections = Connection.objects.all()
for connection in connections:
if {'name': connection.source_tool.name, 'id': connection.source_tool.id} not in nodes:
nodes.append({'name': connection.source_tool.name, 'id': connection.source_tool.id})
if {'name': connection.target_tool.name, 'id': connection.target_tool.id} not in nodes:
nodes.append({'name': connection.target_tool.name, 'id': connection.target_tool.id})
if {'source': connection.source_tool.id, 'target': connection.target_tool.id} in links:
links.replace({'source': connection.source_tool.id, 'target': connection.target_tool.id, 'type': links['type'] + '/' + connection_type})
else:
links.append({'source': connection.source_tool.id, 'target': connection.target_tool.id, 'type': connection.connection_type})
json['nodes'] = nodes
json['links'] = links
print(json)
return JsonResponse(data=json)
Cela renvoie, par exemple
{
'nodes':
[
{'name': 'Ansible', 'id': 1 },
{'name': 'Terraform', 'id': 2},
{'name': 'Foreman', 'id': 3}
],
'links':
[
{'source': 1, 'target': 2, 'type': 'SSH'},
{'source': 2, 'target': 3, 'type': 'REST-API'}
{'source': 1, 'target': 2, 'type': 'REST-API'}
]
}
Mon cas d'utilisation est que je veux modifier les connexions pour ne pas obtenir 2 entrées différentes dans la liste pour la même connexion, qui ne diffère que dans le type. Au lieu du JSON ci-dessus, je veux obtenir ceci :
{
'nodes':
[
{'name': 'Ansible', 'id': 1 },
{'name': 'Terraform', 'id': 2},
{'name': 'Foreman', 'id': 3}
],
'links':
[
{'source': 1, 'target': 2, 'type': 'SSH/REST-API'},
{'source': 2, 'target': 3, 'type': 'REST-API'}
]
}
Actuellement, je ne suis pas en mesure de créer une requête ou de modifier la liste de dictionnaires pour trouver l'entrée où source et target sont identiques à l'entrée actuelle (en itérant à travers la liste), et de modifier le champ type.
J'utilise Django 3.1 avec Python 3.8.
Cordialement