2012-05-20 2 views
1

그래프 노드를 나타내는 모델을 만들려고합니다.django - ManyToManyField - 하나의 모델에서 필드 건너기

class Node(models.model): 
    ins = models.ManyToManyField("self", null=True, blank=True) 
    outs = models.ManyToManyField("self", null=True, blank=True) 

이제 노드 a와 b가 있다고 가정 해 보겠습니다. b django를 as에 추가하면 (왜냐하면 'symmetrical'속성 때문에) a를 위해 b를 추가 할 것입니다.

설정 방법을 잘 모르겠다 -> b 자동으로 설정 됨 b < - a.

중산층 관계에 대해 생각했지만 어떻게 작동하는지 실제로 알지 못합니다. 문자 그대로 쓰는 법.

뭔가 그런 식으로 볼 줄 :

class Node(models.Model): 
    ins = models.ManyToManyField("self", null=True, blank=True, through="Edge") 
    outs = models.ManyToManyField("self", null=True, blank=True, through="Edge") 

class Edge(models.Model): 
    node1_ins = models.ForeignKey(Node) 
    node2_outs = models.ForeignKey(Node) 

그러나 물론이 일이 전혀 작동하지 않습니다.

어떻게 해결할 수 있을까요? 사전에

감사합니다, 그렉

true로 대칭 설정할 수 있습니다
+0

명확히하기 위해 B와의 관계를 피하는 방법을 묻는 것입니까? – jdi

+0

아니요, 수동으로 'b'를 'a'로 설정하면 강제로 'a'를 'b'밖으로 설정하는 방법을 묻습니다. 지금은 분명합니까? – Gricha

답변

4

이 같은 것을 시도 할 수 있습니다 : 나는 여러 M2M 필드를 관리하는 단지 지저분하게 테이블 "을 통해"여러 요구 것을 발견

from django.db import models 

class Node(models.Model): 
    outs = models.ManyToManyField("self", null=True, blank=True, 
     symmetrical=False, related_name="ins", through='Edge') 

class Edge(models.Model): 
    from_node = models.ForeignKey(Node, related_name='edges_down') 
    to_node = models.ForeignKey(Node, related_name='edges_up') 

.

n1 = Node.objects.create() 
n2 = Node.objects.create() 
edge = Edge.objects.create(from_node=n1, to_node=n2) 

print n1.outs.all() 
#[<Node: Node object>] 
print n1.ins.all() 
# [] 

print n2.outs.all() 
# [] 
print n2.ins.all() 
# [<Node: Node object>] 

이 패턴을 사용하면 from-to 관계로 설정됩니다. outs은 명시 적이며 ins은 관계가됩니다. 어쩌면이게 효과가 있을까요?

노드 객체의 edges_upedges_down 관계를 통해 관계 가장자리를 찾을 수도 있습니다.

n1.edges_down.all() 
# [<Edge: Edge object>] 

n2.edges_up.all() 
# [<Edge: Edge object>] 

여기에는 이름이 명확하지 않을 수 있습니다. 나는 "업스트림"과 "다운 스트림"이라는 개념을 좋아합니다.

+0

그건 좋은 해결책이야, 고마워! – Gricha

0
+0

잘못되었습니다. 대칭은 기본적으로 True입니다. 그것은 내 관계가 in-in, out-out으로 행동한다고 ​​결정하는 것입니다. – Gricha

+0

@Gricha : 이러한 의견에 대해 이처럼 날카로운 태도를 취할 이유는 없습니다. 사람들이 노력하고 있습니다. – jdi

+0

@Gricha : jdi가 말했듯이, 나는 단지 도우려는 것뿐입니다. 그런 사람들을 부르는다면 사람들은 당신을 돕기 전에 두 번 생각할 것입니다. – dannyroa

관련 문제