2012-07-11 3 views
3

장고 데이터베이스 관계를 처리하는 방법에 대한 더 나은 처리를 시도합니다. 의견을 보내 주시면 감사하겠습니다.장고 모델 ManyToMany 및 외래 키

고려하여 다음 예 모델 : syncdb에서

class Things(models.Model): 
    name = models.CharField(max_length=20) 

class Stuff(models.Model): 
    name = models.CharField(max_length=20) 
    information = models.ManyToManyField('Information') 
    things = models.ForeignKey('Things') 

class Information(models.Model): 
    name = models.CharField(max_length=20) 
    stuff = models.ForeignKey('Stuff') 

오류 결과 : AttributeError: 'ManyToManyField' object has no attribute 'ForeignKey'. ManyToManyField 및 필드를 Stuff 모델에 포함하면 오류가 발생합니다.

이러한 관계가 모두 존재할 수있는 방법이 있습니까? 어떤 아이디어 주셔서 감사합니다. 아마 당신이 가야에 충분하다

Error: One or more models did not validate: 
foo.stuff: Reverse query name for m2m field 'information' clashes with field 'Information.stuff'. Add a related_name argument to the definition for 'information'. 
foo.information: Reverse query name for field 'stuff' clashes with m2m field 'Stuff.information'. Add a related_name argument to the definition for 'stuff'. 

: 장고의

+0

_Stuff_에는 _ManyToMany_wi가 있습니다. _ _ 정보 _ 있지만 _ManyToOne_있는 _Stuff_있는 _Information_. – Rohan

+1

코드 샘플에서 정보와 항목 간의 관계가 일대 다 또는 다 대다가되는지 여부를 판단하는 것은 불가능합니다. – user240515

+0

아이디어는 '물건'이 여러 개의 '정보'를 가질 수 있지만 '정보'는 한 가지 유형의 '물건'을 참조한다는 것입니다. 따라서 ManyToMany는 Stuff에서 Information으로, ForeignKey는 Information에서 Stuff으로 각각 변환됩니다. 그것은 내 머리에서 잘 작동하지만 Django에서는 그렇지 않습니다. 어떤 아이디어? –

답변

4

stuff에 얼마나 많은 information이 링크되어 있는지 알고 싶다면 django는 뒤로 이동하는 기본값 인 manager을 제공합니다. 이를 위해 stuff에는 외래 키가 필요하지 않습니다.

class Things(models.Model): 
    name = models.CharField(max_length=20) 

class Stuff(models.Model): 
    name = models.CharField(max_length=20) 
    information = models.ManyToManyField('Information') 
    things = models.ForeignKey('Things') 

class Information(models.Model): 
    name = models.CharField(max_length=20) 

이 모델은 같은 쿼리를 수행 할 수 있습니다 : "stuffX에 대한 information 무엇입니까"

  • "stuffY의 경우 어떤 information이 링크되어 있습니까?"
  • 는"나에게 thingZ에 대한 모든 stuffinformation 찾기 "또한

는 당신이 각 thingstuff 여러 stuff 여러 information있을 수 있습니다.

을에서 이러한 질문을 쓰기 시작은 데이터베이스에서 불필요한 링크/관계없이 정확한 모델을 개발하는 데 도움이됩니다.

0

내 버전은 좀 더 정보를 제공합니다.

information = models.ManyToManyField('Information', related_name='stuff_many_set') 
stuff = models.ForeignKey('Stuff', related_name = 'info_set') 

syncdb 행복 할 것입니다 ... ManyToManyField 관계 및 물건에 대한 정보에서 ForeignKey 관계 모두에 대해 related_name을 정의합니다. 물론 두 관계가 모두 필요하다고 확신해야합니다. 여기서 일반적인 엔티티 이름을 사용하면 약간의 혼동이있을 수 있습니다.

$python manage.py syncdb 
Error: One or more models did not validate: 
t.stuff: Reverse query name for m2m field 'information' clashes with field 'Information.stuff'. Add a related_name argument to the definition for 'information'. 
t.information: Reverse query name for field 'stuff' clashes with m2m field 'Stuff.information'. Add a related_name argument to the definition for 'stuff'. 

이유 :

+0

입력 해 주셔서 감사합니다. 그러나 'related_name'인수를 모델에 추가해도이 문제는 해결되지 않았습니다. 파이썬은 여전히 ​​다음과 같이 말합니다. 'ManyToManyField'객체에는 외래 키와 ManyToManyField가 모두있는 경우에만 'ForeignKey'속성이 없습니다. –

+0

'related_names' 매개 변수로 무엇을 사용하고 있습니까? django가 생성하는 값 중 하나와 충돌 할 수 있습니다. 또한 : 어떤 버전의 장고를 사용하고 있습니까? – unayok

0

는 기본적으로이 같은 오류가 발생하는 것? 간단하게 당신이 서로 참조하는 두 테이블을 가지고, 문제는 여기에 역방향 조회 업을 적용하면 django는 충돌을 만드는 동일한 이름을 생성합니다.

오류 상태와 마찬가지로 related_name을 추가해야합니다. 이렇게하면 django가 여러 역방향 호출을 구분하는 방법을 알고 있습니다.

from django.db import models 

class Things(models.Model): 
    name = models.CharField(max_length=20) 

class Stuff(models.Model): 
    name = models.CharField(max_length=20) 
    information = models.ManyToManyField('Information', related_name = 'information_information') 
    things = models.ForeignKey('Things') 

class Information(models.Model): 
    name = models.CharField(max_length=20) 
    stuff = models.ForeignKey('Stuff', related_name = 'information_stuff') 

죄송합니다. 이름이 지나치게 창조적인데, 작동하지 않아야합니다.

+0

입력 해 주셔서 감사합니다. 그러나 'related_name'인수를 모델에 추가해도이 문제는 해결되지 않았습니다. 파이썬은 여전히 ​​다음과 같이 말합니다 :''ManyToManyField '객체는 외계 키와 ManyToManyField가 둘 다 Stuff 모델에만있는 경우에만'ForeignKey '라는 속성을 갖지 않습니다. –

+0

@NickB 다른 작업을 수행해야하는 이유는 내가 게시 한 예제가 잘 작동하기 때문에 다른 문제가있을 수있는 자체 코드를 테스트해야하기 때문입니다. –