2014-01-05 49 views
0

我有以下關係:獲取Django的紀錄外鍵

class AMe(models.Model): 
    Field1     = models.CharField(max_length=50, choices = Field1_CHOICES) 
    Field2     = models.CharField(max_length=50, choices = Field2_CHOICES) 

class MP(models.Model): 
    MyAMeID     = models.ForeignKey(AMe) 
    Field1     = models.CharField(max_length=50, choices = Field1_CHOICES) 

現在的問題是,我想通過外鍵即MyAme以選擇MP記錄,但FK不是與AMe的主鍵相同,那麼在MP中選擇記錄的萬無一失的方法是什麼?我應該使用查詢集和篩選器選項嗎?還是有一個更聰明的方法,更多的Django這樣做,我錯過了嗎?

回答

3

您可以使用my_AMe_object.mp_set.all()(Django的自動創建ForeignKey領域通過連接模型的名字反向關係 - 在這裏mp - 和_set,可以直接通過related_name字段屬性進行設置),或MP.objects.filter(MyAMeID=my_AMe_object)。反向關係的

實例:

>>> from test_app.models import AMe, MP 
>>> ame = AMe.objects.create() 
>>> for _ in xrange(6): 
...  MP.objects.create(MyAMeID=ame) 
>>> ame.mp_set.all() 
[<MP: MP object>, <MP: MP object>, <MP: MP object>, <MP: MP object>, <MP: MP object>, <MP: MP object>] 

注意,儘管mp_set結果(類似於常規Model.objects.all()方法)的數目返回一個QuerySet對象。

+0

我是否必須將MyAMeID作爲此MyAMeID_id出現在表中? – disruptive

+0

如果您將模型的實例傳遞給'filter',請使用該字段的名稱。在這種情況下,這將是'MyAMeID'。如果你正在傳遞一個主鍵,使用'MyAMeID_id'(django在引擎蓋下添加'_id')。 –

+0

嗯。我似乎無法得到這兩種方法中的任何一種。它應該工作,過濾器方法是最熟悉的,但也是mp_set.all()返回以下錯誤:AMe'對象沒有屬性'mp_set' – disruptive