2017-04-03 50 views
1

我正在研究一個Django項目,並試圖爲我的數據創建一些鏈接模型,它在思考工作,但似乎無法解決如何訪問鏈接的數據。Django - 從外鍵獲取數據

class One(models.Model) 
    name = models.CharField(max_length=50) 
    list = models.ArrayField(models.CharField(max_length=50), blank=True) 

    def __str__(self): 
    return self.name 

class Many(models.Model) 
    name = models.CharField(max_length=50) 

    related = models.ForeignKey(One, null=True, blank=True) 

    def __str__(self): 
    return self.name  

這是我建立的一般關係。

我想要做的是,在模板中有權訪問所有'Ones'列表,並通過其中的每一個,都可以訪問每個Many以及它的相關屬性。我可以看到如何訪問單個「One」的屬性,但不知道如何通過它們及其相關的「Many」模型以及每個模型的相關屬性。基本上,我希望輸出的結果是One的下拉列表,當提交時,一些Javascript將使用'Many'模型中的列表來做一些事情。

任何意見將不勝感激。

+0

你要更新使用AJAX調用即填充基於在第一個下拉選擇在第二個下拉選項的用戶界面? – AKS

+0

不,我實際上使用OpenLayers,所以列表實際上是國家名稱,將在地圖上突出顯示 – Nowandthen98

回答

1

如果你已經具有One模型類的對象,您可以使用many_set(參考:backward relations)訪問many對象:

{% for one_obj in one_objs %} 
    {% for m_obj in one_obj.many_set.all %} 
     # do stuff with m_obj here 
    {% endfor %} 
{% endfor %} 

這裏需要注意的一點是,這將對每個m_obj執行db查詢。爲了達到這個效率,你可以在你的視圖中預取many_setone_objs

在您看來,使用prefetch_related

one_objs = One.objects.all().prefetch_related('many_set') 
1

反向查找可通過對象的___set attribte訪問。因此,爲了讓所有的「很多」對象對於一個給定的「一」你可以做one.many_set

Django reverse lookup of foreign keys

關於在模板中使用,集是通過添加訪問「所有」(因爲集中返回查詢集,您可以運行對其進行查詢,包括模板)

Access ForeignKey set directly in template in Django

見Django文檔的相關部分:https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

1

您可以使用Django的「prefetch_related」和Django的「related_name」。

此外,這個問題已經回答here

雖然,這裏是你可能想什麼,第一,你的外鍵定義改成這樣:

related = models.ForeignKey(One, null=True, blank=True, related_name='relateds') 

然後你就可以反向取外鍵:

one = One.objects.get(name="TheOneYouWant").prefetch_related('relateds') 
manys = one.relateds