Как выполнить итерацию двух моделей django

У меня есть несколько моделей в моем проекте django. я хочу итерировать их все, чтобы я мог получить доступ к ним в поле модели django. как я могу это сделать?

Я пробовал застегнуть их как в моем views.py, например:

inventory = Inventory.objects.all()
header = Header.objects.all()
setup = Setup.objects.all()
revision = Revisions.objects.all()
spec = SpecificationDetails.objects.all()
review = Reviewers.objects.all()

zippedItems = zip(inventory, header, setup, revision, spec, review)
context = {
        'zippedItems':  zippedItems

}
return render(request, 'crud/dashboard.html', context)

и в моем файле шаблона я пытался

{%for items in zippedItems %}
<td>{{items}}</td>

но он не работает, и я думаю, что он не заархивировал объекты. есть советы, как я могу этого добиться?

Я думаю, что вы можете сначала перечислить наборы запросов, а затем объединить их все вместе.

inventory = list(Inventory.objects.all())
header = list(Header.objects.all())
setup = list(Setup.objects.all())
revision = list(Revisions.objects.all())
spec = list(SpecificationDetails.objects.all())
review = list(Reviewers.objects.all())
iters = inventory + header + setup + revision + spec + review

Please User Like this Вы преобразуете модель queryset в List и затем добавляете их в List...тип всего списка - список кортежей. Затем, вы должны преобразовать список в zip-файл. Передайте этот zip файл в pandas dataframe. Это автоматически управляет вашим zip файлом, предоставляя данные в правильном формате столбцов...

inventory = list(Inventory.objects.all())
header = list(Header.objects.all())
setup = list(Setup.objects.all())
revision = list(Revisions.objects.all())
spec = list(SpecificationDetails.objects.all())
review = list(Reviewers.objects.all())
iterates = inventory + header + setup + revision + spec + review

zip_file = list(zip(iterates))

import pandas as pd

df = pd.DataFrame(zip_file, columns = ['Inventory', 'Header','Setup','Revisoin','Spec','Review'])

context = {
        'df':  df
}
return render(request, 'crud/dashboard.html', df)

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

Пожалуйста, ознакомьтесь с приведенным ниже zip примером для лучшего понимания.

ZIP Пример:

inventory = [1, 2, 3, 4]
header = [5, 6, 7, 8]
setup = [9, 10, 11, 12]
revision = [13, 14, 15, 16]
spec = [17, 18, 19, 20]
review = [21, 22, 23, 24, 25, 26]

zippedItems = zip(inventory, header, setup, revision, spec, review)

for inventory, header, setup, revision, spec, review in zippedItems:
    print(f'inventory: {inventory} - header: {header} - setup: {setup} - revision: {revision} - spec: {spec} - review: {review}')

Выход:

inventory: 1 - header: 5 - setup: 9 - revision: 13 - spec: 17 - review: 21
inventory: 2 - header: 6 - setup: 10 - revision: 14 - spec: 18 - review: 22
inventory: 3 - header: 7 - setup: 11 - revision: 15 - spec: 19 - review: 23
inventory: 4 - header: 8 - setup: 12 - revision: 16 - spec: 20 - review: 24

Из вывода видно, что он не вывел последние значения списка обзора, так как они не находятся в диапазоне 4.

Вы можете оставить этот код как есть:

inventory = Inventory.objects.all()
header = Header.objects.all()
setup = Setup.objects.all()
revision = Revisions.objects.all()
spec = SpecificationDetails.objects.all()
review = Reviewers.objects.all()

zippedItems = zip(inventory, header, setup, revision, spec, review)
context = {
        'zippedItems':  zippedItems

}
return render(request, 'crud/dashboard.html', context)

У вас проблема с HTML частью. Она должна быть примерно такой:

{% for inventory, header, setup, revision, spec, review in zippedItems %}
    {{ forloop.counter }}
    {{ inventory.model_field_name }}
    {{ header.model_field_name }}
    {{ setup.model_field_name }}
    {{ revision.model_field_name }}
    {{ spec.model_field_name }}
    {{ review.model_field_name }}
{% endfor %}

Если вы все еще сталкиваетесь с какой-либо проблемой, дайте мне знать. :)

Вернуться на верх