2017-10-04 26 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'吗? –