2017-10-04 3 views
0

Ich habe ein Modell Article und mehrere ArticleDescription (eine für jede Sprache).Wie rückwärts Joins gefiltert werden?

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) 

Ich habe jetzt Probleme, wie man einen Join erstellt, um nur die aktuelle Sprache in meiner Vorlage zu wählen.

ich diesen Code verwenden, um meine Artikel zu erhalten:

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

In c, ich habe meine ArticleDescriptions in meiner Vorlage wie folgt aus:

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

Aber ich will nicht alle Beschreibungen , nur der für die aktuelle Sprache. Also ich bin auf der Suche nach so etwas wie:

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

und dann kann ich die Beschreibung wie dies in meiner Vorlage verwenden:

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

Aber ich habe keine Ahnung, wie dies zu tun, oder wo sie suchen .

Antwort

2

Sie können dies mit prefetch_related und einem benutzerdefinierten Prefetch-Objekt tun. Dies muss in der Ansicht erfolgen.

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')) 

Jetzt können Sie tun:

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

Dank es funktioniert, aber es ist zu beachten, dass 'b.filtered_descriptions' ist ein Array von' ArticleDescription'. –

+0

Ja, willst du das nicht? –

+0

Ja, es ist gut. In diesem Fall weiß ich, dass es nur ein Treffer ist. Noch eine kleine Frage, kann ich die 'filtered_descriptions' auch in einem' Q' Objekt im 'filter' verwenden? –

Verwandte Themen