2011-02-25 118 views
1

我的模型定義:根據字段獲取模型實例?

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

我有Thing2的實例,稱爲myThing2。 我想要做這樣的事情:

Thing1.objects.get(thing2s__contains = myThing2) 

這不工作的功能代碼,但希望你明白我的意思。 (我試圖找到一個Thing1,它的thing2s字段中有myThing2。)我該怎麼做?

感謝您的幫助!

回答

2

就我個人而言,我會爲您的多對多定義添加'related_name'。

喜歡的東西

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

然後,從Thing2,您可以訪問 'thing1s',它涉及到由....

thing2.thing1s.all() 

但是,我要問,作爲如上所述,如果thing2只能與一個thing1相關,那麼你應該使用ForeignKey(在Thing2中,而不是Thing1中)而不是ManyToMany。但是,上述解決方案仍然有效。

所以,你的類將是....

class Thing1(models.Model): 
    pass 

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

所以,從thing2,你可以得到在通過簡單的單thing1 ....

a_thing1 = thing2.thing1 

,並從thing1,你可以得到所有通過引用它的thing2s列表....

thing2s = thing1.thing2s.all() 
2

這不是測試,但我相信你會說

Thing1.objects.filter(thing2s = myThing2) 

由於多個Thing1可以有Thing2,使用過濾器拉出所有有myThing2的Thing1s的。

過濾器返回Thing1的列表。

+0

好感謝您的幫助,但實際上,我的數據庫是由這樣一個Thing2只能是長到一件事1。這個主要問題是在我的「thing2s = myThing2」聲明中。我不知何故必須通過Thing2s的thing2s列表來查看myThing2是否在該列表中。 – Andrew 2011-02-25 02:00:25

+1

聽起來你可能實際上需要使用ForeignKey而不是ManyToMany - 這就是你描述的情況下使用的關係。話雖如此,如果您使用的是ManyToMany,lovefaithswing的答案是正確的 - thing2s = myThing2將設置連接來過濾關聯的Things2的列表。 – 2011-02-25 02:48:08