좋아, 몇 가지 조사 후 - 여기 결과입니다 : - : 그럼 https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey
재귀 관계와 외래 키 사용하는 경우, 대신 클래스 이름의 '자기'를 사용한다
첫째, 메모 - ForeignKey는 OneToOne 관계입니다. 부모 노드를 열거하는 동안 Node 자식을 열거하는 것은 올바르지 않습니다 ... 위로 Node_objects.all()로 실행되는 것으로 보이는 node_set.all()을 호출하면 그 이유는 무엇입니까? 새로 생성 된 Node 인스턴스에 대한 항목을 표시합니다 (DB에 저장되지 않음). 사실 node.node_set은 노드에 대한 외래 키를 가져 오기 위해 여기에 사용할 수 없습니다. 노드에 여러 아이를 가질하기 위해 - 당신이 ManyToManyField를 사용해야합니다, 예를 들면 :
children = models.ManyToManyField('self', null=True)
한 다음 사용하여 호출 :
node.children.all() # for all children
또는
node.children.count()
편집를 :
간략한 분석 :
,
class A(model):
parent = ForeignKey(B)
다음
a = A()
b = B()
b.parent_set.all()
모든 부모로서 B를 가진, 또는 모든 A의 것을 가지고 PARENT_ID = b.id.를 반환합니다 귀하의 경우에는, 당신은 실제로 있습니다
a = A()
b = A()
b.parent_set.all()
이 돌아갑니다 (A ==) 부모로서 B를 가지고 있으며,이 경우 a.parent_id = b.id에서, 그러나 아무도 b.id없는 모든 A의 (안 저장 됨), 따라서 parent_id = None 인 모든 노드 (b)를 얻을 수 있습니다.
실제로이 동작은 비 재귀 관계에서도 동일합니다. 첫 번째 예에서는 A()가 parent = None으로 저장되어 있고 저장되지 않은 B의 경우 b.parent_set.all()에 저장됩니다.
위의 코드를 테스트했으며 child_cnt()는 0을 나타내며 node_set.all()은 []을 반환합니다. 나에게 그것은 특정 모델이나 앱에서 모델에 몇 가지 변경을 가하는 코드가있어 모델을 변경하는 것처럼 보입니다. – Tisho
힌트를 보내 주셔서 감사합니다. 위의 코드에서 root.save()를 추가하는 것을 잊었습니다. 나는 그것을 바로 잡았다. 내 컴퓨터에서 실행은 이제 새로운 Django 프로젝트에 대해서도 말한 것처럼 동작합니다. – Qlaus