2016-06-27 6 views
1

Ich habe mehrere Datenbanktabellen, die mit Fremdschlüsseln verknüpft sind (Sie müssen die grundlegenden Beispiele hier verzeihen, ich habe Probleme beim Kopieren/Einfügen aus meiner Entwicklungsumgebung) .Anzeige der verknüpften Datenbankergebnisse in einer einzigen HTML-Tabelle

# models.py 
class Task(models.Model): 
    details = models.ForeignKey(Details) 
    task = models.CharField(max_length=1024, null=false) 

class Activity(models.Model): 
    task = models.ForeignKey(Task) 
    activity = models.CharField(max_length=1024) 

class Resources(models.Model): 
    activity = models.ForeignKey(Activity, null=false) 
    resources = models.CharField (max_length=1024) 

Ich muss diese Ergebnisse in einer einzigen Tabelle anzeigen. Beachten Sie, dass eine Aufgabe keine Aktivitäten haben kann und eine Aktivität möglicherweise keine Ressourcen haben, usw. Zum Beispiel:

  • Task1
    • Activity1
      • Resource1
      • Resource2
    • Activity2
  • Task2
    • ... etc ...

Bisher habe ich einen Tisch in meinem forms.py erstellt haben, die alle Felder enthält, die möglicherweise in eine vorhanden sein könnte Datenbankergebnis. Also:

# forms.py 
class ViewTable(tables.Table): 
    task = tables.Column(default=' ') 
    activity = tables.Column(default=' ') 
    resource = tables.Column(default=' ') 

Ich wurde dann itertools.chain unter Verwendung der Ergebnisse zusammen in der richtigen Reihenfolge zu verbinden und sie dann in die Vorlage zu machen. Ich bin in einer Sackgasse hier:

# views.py 
table = None 
for task in tasks: 
    if table: 
     table = list(chain(table, task) 
    else: 
     table = task 

    for activity in Activities.objects.filter(tasks=task): 
     table = list(chain(table, activity)) 
     for resource in Resources.objects.filter(activity=activity): 
      table = list(chain(table, resource)) 

return render(request, 'table.html', {'table', table, }) 


# table.html 
<table> 
    <tr> 
     <th>Tasks</th> 
     <th>Activity</th> 
     <th>Resources</th> 
    </tr> 
{% for item in table %} 
    <tr> 
     <th>{{ item.task }}</th> 
     <th>{{ item.activity }}</th> 
     <th>{{ item.resource }}</th> 
    </tr> 
{% endfor %} 
</table> 

Dies, weil funktioniert nicht, wenn ich nur eine Aufgabe hat (und keine Aktivitäten oder Ressourcen), dann das Objekt nicht iterable ist, so bekomme ich einen Fehler, wenn ich versuche es in der Vorlage zu rendern.

Aber insgesamt habe ich das Gefühl, dass dies ein schlampiger und langsamer Weg ist, Dinge zu tun, und ich habe Schwierigkeiten, einen besseren Weg zu finden. Korrekturen oder komplett alternative Empfehlungen sind willkommen!

Das Ziel ist, etwas zu bekommen, die wie folgt angezeigt:

 
Tasks  Activities  Resources 
------------------------------------- 
task1 
      activity1 
         resource1 
         resource2 
      activity2 
task2 
+0

Nicht sicher, warum Sie django-tables2 in diesem Fall verwenden würden, es scheint auch, dass Sie es überhaupt nicht in Ihrem Ansichtscode verwenden. Abgesehen davon: Wenn Sie einen Fehler bekommen, dass etwas nicht iterierbar ist, sollten Sie überprüfen, ob es ist, bevor Sie versuchen, darüber zu iterieren. – Jieter

+0

Sie haben Recht, ich habe nicht bemerkt, dass 'tables.Table' ein Teil von' django-tables2' war. Dieser Teil ist also nicht notwendig. Meine Frage war, wie ich mir etwas ausdenken sollte, das ich in meinem "Gesamtziel" gepostet habe.Ob das Objekt iterierbar ist (den Code, den ich habe) oder eine komplett andere Lösung ist, ich bin ganz Ohr. –

+0

Hmm, wenn Sie sich Ihre Beispiele ansehen, gibt es mehrere Syntaxfehler ('false' vs.' False', fehlende Klammern). Bitte lesen Sie, wie Sie ein [minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) bereitstellen können. Es ist nicht notwendig, ein komplettes Djangoprojekt bereitzustellen, aber Ihr Code sollte ohne Syntaxfehler laufen, die Ansicht sollte vollständig sein. und Ihre Modelle ohne externe Abhängigkeiten ... – Jieter

Antwort

0

ich nicht erkennen, dass ich durch ein Objekt durchlaufen konnte und jedes dieser Elemente zu einer Liste hinzuzufügen. Ich konnte mein eigenes Problem wie so lösen:

all = [] 

task = Tasks.objects.get(id=1) 
all.append(task) 

activities = Activities.objects.filter(task_id=task) 
for activity in activities: 
    all.append(activity) 
    resources = Resources.objects.filter(activity_id=activity) 
    for resource in resources: 
     all.append(resource) 

Von dort ich in der Lage bin nur all in meiner Vorlage fallen und Zugang {{ all.activity_num }} usw.

Ich glaube, ich brauche etwas mehr Lesen zu tun darüber, wie Objekte konstruiert werden. Vielen Dank!

Verwandte Themen