2016-06-27 6 views
1

У меня есть несколько таблиц базы данных, которые связаны с внешними ключами (вам придется простить основные примеры здесь, у меня возникли проблемы с копированием/вставкой из моей разработки env прямо сейчас) ,Отображение результатов связанной базы данных в одной таблице HTML

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

Мне нужно отобразить эти результаты в одной таблице. Обратите внимание, что задачи не может иметь деятельности и деятельность не может иметь каких-либо ресурсов и т.д. Например:

  • TASK1
    • Activity1
      • Resource1
      • Resource2
    • Деятельность2
  • Task2
    • ... и т.д. ...

До сих пор я создал таблицу в моем forms.py, который содержит все поля, которые могли бы присутствовать в результат базы данных. Итак:

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

Я был тогда с помощью itertools.chain, чтобы связать результаты вместе в правильном порядке, а затем вынести их в шаблон. Я в тупике здесь:

# 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> 

Это не работает, потому что если у меня есть только одна задача (и никаких действий или ресурсов), то объект не итерацию, так что я получаю ошибку, когда я попробуйте сделать его в шаблоне.

Но в целом я чувствую, что это неряшливый и медленный способ делать что-то, и у меня возникают проблемы с лучшим способом. Исправления или полностью альтернативные рекомендации приветствуются!

Общая цель состоит в том, чтобы получить что-то, что показывает, как это:

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

Не знаете, почему вы должны использовать django-tables2 в этом случае, похоже, что вы вообще не используете его в своем представлении кода. Кроме того: если вы получаете сообщение об ошибке, что что-то не итерируемо, вы должны проверить, не до того, как попытаться перебрать его. – Jieter

+0

Вы правы, я не понимал, что 'tables.Table' был частью' django-tables2'. Так что эта часть не нужна. Мой вопрос заключался в том, как придумать что-то вроде того, что я написал в своей «общей цели».Является ли этот объект итерируемым (исправление кода, который у меня есть) или совершенно другим решением, я все уши. –

+0

Хм, глядя в ваши примеры, есть несколько синтаксических ошибок ('false' vs' False', отсутствующие скобки). Пожалуйста, прочитайте, как предоставить [минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve) Нет необходимости предоставлять полный проект django, но ваш код должен работать без синтаксических ошибок, представление должно быть полным, и ваши модели без внешних зависимостей ... – Jieter

ответ

0

Я не понимал, что я мог бы итерацию через объект и добавить каждый из этих элементов в список. Я был в состоянии решить мою собственную проблему следующим образом:

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) 

Оттуда я в состоянии просто бросить all в мой шаблон и доступ {{ all.activity_num }} и т.д.

Я думаю, мне нужно сделать еще кое-что почитать о том, как создаются объекты. Благодаря!

Смежные вопросы