2011-04-11 7 views
1

이것은 매우 사소한 질문 인 것 같습니다. 그러나 그것은 나를 죽이고 있습니다.Django ManyToManyField 오류 개체에 'location_set'속성이 없습니다

쉘에서

class Location(models.Model): 
    place = models.CharField("Location", max_length=30) 
    [...] 

class Person(models.Model): 
    first = models.CharField("First Name", max_length=50) 
    [...] 
    location = models.ManyToManyField('Location') 

models.py :

>>> from mysite.myapp.models import * 
>>> p = Person.objects.get(id=1) 
>>> p 
<Person: bob > 
>>> l = Location(place='123 Main') 
>>> p.location_set.add(l) 
>>> p.save() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'Person' object has no attribute 'location_set' 

정말 저는 누락 된 것을 확인할 수 없습니다.

답변

2

p.location.add()을 사용해야합니까? location_set 또는 <modelname>_set은 해당 모델의 reverse lookup의 기본 이름입니다. 이를 염두에두고

p.location.add(l) 

:

1

location_set는 필드 이름을 통해 관련 관리자에 액세스 할 수 있습니다, 당신은 Person 모델에 ManyToManyField 정의한 그러나 이후, 이전 버전과의 관계에 대한 기본 이름이됩니다 , ManyToManyField을 복수형 명사 (예 :

또한 메모리에서 모델 인스턴스를 다 대다 관계에 추가하려고하면 추가하기 전에 인스턴스를 저장해야합니다.

+0

감사합니다. 나는 "앞으로"와 "뒤로"라는 구별이 있다는 것을 깨닫지 못했습니다. 그 이유가 있을까요? 분명히 매핑 테이블 자체는 그러한 "방향성"을 생성하지 않습니다. – jal

+0

맞습니다. 그러나 필드 자체는 관계의 '끝'을 나타냅니다. 이 경우 'Location'에서 'Person'까지의 역방향 관계는'person_set'입니다. –

+0

나는 그것을 얻었고 도움을 주셔서 감사합니다. Django는 "should"위에 무겁습니다. 여러분이 자신의 방식대로하면 쉽습니다. 나는 내가 묻고있는 것이 무엇인지 추측한다. 왜 계급 간 차이가있을 것인가? 여기에 관계의 벡터가 있는가? 디자인 결정의 대부분은 나에게 의미가 있습니다 - 이것은 프레임 워크보다 나에 관한 것입니다. 그러나 – jal

관련 문제