2017-10-17 2 views
1

In einer Django-Applikation übergeben:Django: verwandte Objekte verwandter Objekte bekommen, und ich habe drei Modelle zur Vorlage

class A(models.Model): 
    aId = models.AutoField(primary_key=True) 

class B(models.Model): 
    bId = models.AutoField(primary_key=True) 
    aId = models.ForeignKey(A) 

class C(models.Model): 
    cId = models.AutoField(primary_key=True) 
    bId = models.ForeignKey(B) 

gibt es eine on-to-many-Beziehung zwischen A und B, da es zwischen B und C. Und es gibt eine View-Klasse mit context_data. In der Vorlage muss ich Bs mit ihren Cs anzeigen und filtern. Wie kann ich alle Bs, die mit einem A und allen Cs verbunden sind, die mit diesen Bs verknüpft sind, an meine Vorlage (Kontext) übergeben? Ich habe versucht, Bs und Cs getrennt in zwei Arrays zu bekommen, aber es scheint keine gute Idee zu sein, da ich Cs nicht nach Bs kategorisieren kann.

Antwort

1

Angenommen, Sie haben eine Instanz A namens a.

bs = a.b_set.all() 
for b in bs: 
    cs = b.c_set.all() 

Um Sie prefetch related objects können mehrere Abfragen zu vermeiden.

1

Das wäre also der Code für Ihre Ansicht. Ich bin mir nicht sicher, von welchen Objekten in den Argumenten/Kwargs gegeben wird.

from django.views.generic import TemplateView 

class YourView(TemplateView): 
    template_name = 'yourtemplate.html' 

    def get_context_data(self, **kwargs): 
     a = kwargs.get('a') 
     b = kwargs.get('b') 
     ctx = super().get_context_data(**kwargs) 

     ctx['all b related to a'] = a.b_set.all() 
     ctx['all c related to b'] = b.c_set.all() 
     return ctx 

Wenn Sie querysets kombinieren müssen, sagen mehrere querysets von cs für jedes b als @s_puria vorgeschlagen, können Sie den Operator UNION https://docs.djangoproject.com/en/1.11/ref/models/querysets/#union

können
Verwandte Themen