2011-02-25 3 views
1

내 모델 정의 :해당 필드를 기반으로 모델 인스턴스를 가져 옵니까?

class Thing1(models.Model): 
    thing2s = models.ManyToManyField(Thing2, blank=True) 

나는 myThing2라는 Thing2의 인스턴스를 보유하고 있습니다. 내가 이런 걸하고 싶지 :

Thing1.objects.get(thing2s__contains = myThing2) 

등의 기능 코드를 작동하지 않습니다, 그러나 희망 당신이 내 포인트를 얻을. (나는 thing2s 필드에 myThing2가있는 Thing1을 찾으려고 노력하고 있습니다.) 어떻게해야합니까?

도움 주셔서 감사합니다.

답변

2

개인적으로 많은 정의에 'related_name'을 추가합니다.

뭔가

class Thing1(models.Model): 
    thing2s = models.ManyToManyField(Thing2, blank=True, related_name='thing1s') 

그런

처럼, 당신의 Thing2에서, 당신은 액세스 할 수있는 'thing1s'은하지만, 내가 같이 질문 할 필요가 ....

thing2.thing1s.all() 

에 관한 것을 위에서 언급 한 것처럼 thing2가 하나의 thing1에만 관련 될 수 있다면 ManyToMany 대신 ForeignKey (Thing1 대신 Thing2)를 사용해야합니다. 그러나 위의 솔루션은 여전히 ​​작동합니다.

그래서, 당신의 클래스가 thing2에서, .... 그래서

class Thing1(models.Model): 
    pass 

class Thing2(models.Model): 
    thing1 = models.ForeignKey(Thing1, blank=True, related_name='thing2s') 

것, 당신은 ...

a_thing1 = thing2.thing1 

과에서 간단하게하여 그 하나의 thing1에서 얻을 수 thing1, 당신은 그것을 통해 참조하는 모든 thing2s의 목록을 얻을 수 있습니다 ....

thing2s = thing1.thing2s.all() 
2

이 테스트하지 않고 두 개 이상의 Thing1가 myThing2이있는 Thing1s을 모두 꺼내하는 Thing2, 사용 필터를 가질 수 있기 때문에 당신이

Thing1.objects.filter(thing2s = myThing2) 

을 말할 것입니다 생각합니다.

필터는 Thing1 목록을 반환합니다.

+0

정말 고마워요,하지만 실제로, 내 DB는 Thing2만이 될 수 있도록 만들어졌습니다. 오래 갈 하나의 Thing1. 이 주요 문제는 내 "thing2s = myThing2"문에 있습니다. 나는 어떻게 든 myThing2가 그 목록에 있는지보기 위해 Thing2s의 thing2s 목록을 필터링해야합니다. – Andrew

+1

ManyToMany가 아닌 ForeignKey를 실제로 사용해야 할 수도있는 것처럼 들립니다. 설명하는 경우 사용할 관계입니다. 즉, ManyToMany를 사용하고 있다면 lovefaithswing의 대답은 정확합니다. thing2s = myThing2는 연결된 Things2s 목록을 필터링하기 위해 조인을 설정합니다. –

관련 문제