2010-01-05 10 views
5

Quiero construir un gráfico no dirigido en Django. He construido un modelo de borde con dos claves externas (primero, segundo) a la clase de nodo, pero hay un conflicto con el nombre relacionado. Puedo usar first_set y second_set, pero dado que el gráfico no está dirigido, no importa si le gusta o no. ¿Cuál es la forma recomendada de lidiar con este escenario?Django gráfico no dirigido

Editar: Aquí son más o menos los modelos con los que trabajo:

class Node(models.Model): 
    #some irrelevant stuff 

class Edge(models.Model): 
    #some other stuff 
    first = models.ForeignKey('Node',related_name=None) 
    second = models.ForeignKey('Node',related_name=None) 

Lo que me gustaría tener es some_node.connected_nodes_set ser algo en el sentido de un RelatedManager, similar a lo que habría sido configurado para cualquiera first_set o second_set si hubiera usado related_names, excepto que tendría todos los nodos que se pueden alcanzar con un solo borde, en lugar de solo aquellos que se pueden alcanzar en una dirección.

+1

¿Puedes publicar tus modelos de bordes y nodos? – Seth

Respuesta

5

Tenía que hacer algo similar con mi proyecto actual. Mi solución fue tener un ManyToManyField en mi equivalente a su modelo Node. Algo como esto:

class Node(models.Model): 
    adjacent = models.ManyToManyField("self", null=True, blank=True) 

Tenga en cuenta que la "self" anterior es necesaria para permitir que el ManyToManyField a punto de volver a sí mismo.

Usando este código, todos los nodos adyacentes a un nodo dado N se pueden encontrar usando N.adjacent.all().

+1

Esto parece prometedor, pero el problema es que necesito algunos datos adicionales en el modelo de borde. A primera vista, parece que podría usar ManyToManyField ("self", through = "Edge", simétrico = True), pero la documentación dice específicamente que debe usar simétrico = falso si está usando un modelo directo. –

+3

Tendrás que asegurarte de que la relación inversa se crea cada vez que hagas un 'Borde', entonces. Fuera de la cima de mi cabeza, eso debería ser posible hacerlo automáticamente anulando el método 'save' de' Edge'. –

+2

El problema con eso, aunque Jeff, es que este no es un gráfico no dirigido si estás haciendo las dos cosas, sino un gráfico dirigido con un par de enlaces para y desde. Si bien es práctico en un sentido, tiene muchas consecuencias topológicas involuntarias. De todos modos, simplemente no parece que django lo soporte de forma nativa. Sin embargo, podría ser posible poner la relación M2M a través de otro modelo y aplicar un poco de lógica al modelo para recrear la relación deseada. No es una respuesta totalmente válida, pero tal es la vida. – Shayne

Cuestiones relacionadas