2014-01-30 4 views
0

나는 Person이라고하는 모델을 가지고 있으며 사람은 여러 관계를 가질 수도 있고 가지지 않을 수도 있습니다. 배우자, 자녀, 부모. 사람이 배우자를 가지고 있지만 그 배우자가 데이터베이스에있는 사람이 아닌 경우 배우자를 다른 사람이 아닌 문자열 값으로 유지할 수 있기를 원합니다.Django ORM 배우자, 자녀, 부모 관계

 
CommandError: One or more models did not validate: 
myapp.person: Many-to-many fields with intermediate tables cannot be symmetrical. 
myapp.person: Many-to-many fields with intermediate tables cannot be symmetrical. 
myapp.person: The model Person has two manually-defined m2m relations through the model Relationship, which is not permitted. Please consider using an extra field on your intermediary model instead. 
myapp.person: Many-to-many fields with intermediate tables cannot be symmetrical. 
myapp.person: The model Person has two manually-defined m2m relations through the model Relationship, which is not permitted. Please consider using an extra field on your intermediary model instead. 
myapp.relationship: Accessor for field 'personA' clashes with related field 'Person.relationship_set'. Add a related_name argument to the definition for 'personA'. 
myapp.relationship: Accessor for field 'personB' clashes with related field 'Person.relationship_set'. Add a related_name argument to the definition for 'personB'. 
: 나는 다음과 같은 오류 메시지가 표시 얻을 ./manage.py의 마이그레이션을 실행하려고하면

class Person(models.Model): 
    spouse = models.ManyToManyField('self', through='Relationship') 
    children = models.ManyToManyField('self', through='Relationship') 
    parents = models.ManyToManyField('self', through='Relationship') 

class Relationship(models.Model): 
    personA = models.ForeignKey(Person) 
    personB = models.ForeignKey(Person, blank=True, null=True) 
    person_name = models.TextField(default='', blank=True) 
    relationship = models.CharField(choices=(('s', 'spouse'), 
              ('c', 'child'), 
              ('p', 'parent')), 
            default='s') 

: 그 때문에 나는이 M2M 관계에 지정된 through 모델이 필요 가정

분명히 나는 그것을 잘못하고있다.

동일한 모델과 그 관계와 관련된 추가 데이터가있는 관계를 어떻게 지정할 수 있습니까?

다른 방법으로 이러한 모델을 구성하여 동일한 데이터를 추적 할 수 있습니까?

+0

왜 사용자로 스텁하지 않습니까? –

+0

그들은 (는) 사용자가 아닙니다. 그들은 작가, 일러스트 레이터 등이며 책, 영화 등과도 관련되어 있습니다. – chadgh

+0

죄송합니다. 문자열 대신 [여기에 사용하는 모델을 삽입 하시겠습니까?]로 스텁하지 않으시겠습니까? –

답변

0

Error creating several recursive m2m relationships과 관련된 질문입니다. Person 모델의 parents, children, spouse 필드를 제거하고 모델의 관련 이름을 relationships으로 설정하여 동일한 효과를 얻을 수 있다는 것을 깨달았습니다.

class Person(models.Model): 
    [ other fields ] 

class Relationship(models.Model): 
    personA = models.ForeignKey(Person, related_name='relationships') 
    personB = models.ForeignKey(Person, blank=True, null=True) 
    person_name = models.TextField(default='', blank=True) 
    relationship = models.CharField(choices=(('s', 'spouse'), 
              ('c', 'child'), 
              ('p', 'parent')), 
            default='s') 

아직 테스트하지는 않았지만 유효성을 검사하고 더 이상 오류 메시지를 표시하지 않습니다. 이것은 또한 더 깨끗해 보인다.

은 내가 나에게 모든 Person.relationshipsrelationship == 's' 반환 Person.spouse 말에 대한 액세스 권한을 부여하기 위해 Person 모델에 대한 몇 가지 속성을 만들 수 상상한다.

+0

이것은 효과가 있습니다. 나는 비슷한 상황에서 비슷한 일을 해왔고이 솔루션은 훌륭하게 작동합니다. – chadgh