2014-10-27 90 views
0

我試圖查詢相關的字段到一個Catalog類,其中許多項目與外鍵相關。目前,我想要:Django QuerysSet查找相關的外鍵字段

article = forms.ModelChoiceField(queryset=Catalog.objects.select_related(
    'article_products')) 

似乎做同樣的查詢爲:

queryset = Catalog.objects.all() 

誰能幫我引導方向是正確的?這是我正在使用的模型。

class Catalog(models.Model): 
    products = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.products 

class Article(models.Model): 
    catalog = models.ForeignKey(Catalog, related_name='article_products') 
    title = models.CharField(max_length=200) 
    abstract = models.TextField(max_length=1000, blank=True) 
    full_text = models.TextField(blank=True) 
    proquest_link = models.CharField(max_length=200, blank=True, null=True) 
    ebsco_link = models.CharField(max_length=200, blank=True, null=True) 

    def __unicode__(self): 
     return self.title 

我的目標是在所有與目錄相關的文章中都有一個表單選擇字段。它目前只顯示目錄的名稱。

+0

您是否使用modelforms?你可以發佈你的整個表格類嗎? – cdvv7788 2014-10-27 03:48:18

回答

1

我不認爲select_related方法將完成您已經設定的使用此ModelChoiceField實現的目標。你說的很正確,下面的兩個查詢返回相同導致查詢集:

Catalog.objects.all().select_related('article_products')) 
Catalog.objects.all() 

Django的查詢集的select_related方法用於不同的功能,具體的性能加強,以減少存取需要獲得數據的數據庫的數量你想從模型實例中檢索。 The Django reference about this method包含非常好的文檔,並舉例說明爲什麼要使用select_related方法來提高性能。

就這樣說,您的原始目的仍然是:表單域將顯示與給定目錄相關的所有文章。

爲了實現這個目標,似乎最好過濾文章對象的查詢集賦予表單域。首先,如果我們想在ModelChoiceField中顯示文章的對象,我們當然應該給予ModelChoiceField含Article對象,而不是目錄對象的查詢集,像這樣:

article = forms.ModelChoiceField(queryset=Article.objects.all()) 

但這個查詢集的說法是不完全正確,無論是。我們仍然傳遞數據庫中存在的所有Article對象的查詢集。相反,我們只想傳遞與給定Catalog對象關聯的文章。爲了實現這一目標,我們可以過濾條查詢集以僅獲得與某個目錄對象的Article對象,像這樣:

# cat is some catalog object 
article = forms.ModelChoiceField(queryset=Article.objects.filter(catalog=cat)) 

在這個例子中,查詢集過濾器返回只包含一個Article對象引用給定的Catalog對象。該查詢集將用於填充ModelChoiceField。

有關按字段查找過濾的更多信息,see the Django documentation here