2017-10-04 50 views
0

我有一個模型Article和幾個ArticleDescription(每種語言一個)。如何過濾反向連接?

class Article(models.Model): 
    articleid = models.CharField(primary_key=True, max_length=100) 

    def __unicode__(self): 
     return str(self.articleid) 


class ArticleDescription(models.Model): 
    article = models.ForeignKey(Article, on_delete=models.CASCADE) 
    lang = models.CharField(max_length=2, default='en', blank=False, null=False) 
    description = models.TextField(blank=True, null=True) 

    class Meta: 
     unique_together = ('article', 'lang') 

    def __unicode__(self): 
     return str(self.description) 

我現在掙扎如何使聯接在我的模板中只選擇當前語言的描述。

我使用此代碼,讓我的文章:

c = models.Article.objects.all().order_by('articleid') 

c,我有我的ArticleDescriptions在我的模板可用這樣的:

{% for b in c %} 
    {{ b.articledescription_set.all }} 
{% endfor %} 

不過,我不希望所有的說明,只是當前語言的一個。所以我要尋找的東西,如:

c = models.Article.objects.all().join(ArticleDescription, lang=curlang).order_by('articleid') 

,然後我可以用這樣的描述我的模板:

{% for b in c %} 
    {{ b.articledescription.description }} 
{% endfor %} 

但是,我不知道如何做到這一點,或在哪裏看。

回答

2

您可以使用prefetch_related和自定義的預取對象來執行此操作。這需要在視圖中完成。

desc = ArticleDescription.objects.filter(lang=curlang) 
c = models.Article.objects.all().order_by('articleid').prefetch_related(Prefetch('articledescription_set', queryset=desc, to_attr='filtered_descriptions')) 

現在你可以這樣做:

{% for b in c %} 
    {{ b.filtered_descriptions }} 
{% endfor %} 
+0

由於它的工作原理,但應注意的是'b.filtered_descriptions'是ArticleDescription'的'數組。 –

+0

是的,這不是你想要的嗎? –

+0

是的,它很好。在這種情況下,我知道這只是一次打擊。另一個小問題是,我可以在'filter'的'Q'對象中使用'filtered_descriptions'嗎? –