Как в Django вывести в HTML отдельно "родителя" и "наследников"?

Требуется в таблицу HTML отдельно вывести "родителя" (тип прибора) и "наследников" (модификация прибора). Пока получется выводить все в один столбец - т.е. если у прибора указан "Тип", то выводится его тип, а если указана модификация, то выводится модификация (см. скриншот), как бы это разбить? P.S. Я не прогромист, а метролог.

models.py

from django.db import models
from mptt.models import MPTTModel, TreeForeignKey


class MPI(models.TextChoices):
    NO = '-', ('нет')
    SIX_MONTHS = '6', ('6 месяцев')
    ONE_YEAR = '12', ('1 год')
    EIGHTEEN_MONTHS = '18', ('1,5 года')
    TWO_YEARS = '24', ('2 года')
    THREE_YEAR = '36', ('3 года')
    FOUR_YEAR = '48', ('4 года')
    FIVE_YEAR = '60', ('5 лет')
    SIX_YEAR = '72', ('6 лет')


class NumberReestr(models.Model):
    """
    Модель НОМЕРОВ и НАИМЕНОВАНИЙ средств измерений по госреестру.
    """

    registry_number = models.CharField(verbose_name='№ Госреестра', max_length=8, blank=True, null=True,
                                       unique=True, error_messages={'unique': 'Повтор! Данные уже занесены'},
                                       help_text='Введите № ГОСРЕЕСТРА')
    title = models.TextField(verbose_name='Наименование прибора по госреестру', max_length=150, blank=True, null=True,
                            unique=True, error_messages={'unique': 'Повтор! Данные уже занесены'},
                            help_text='Введите согласно госреестру НАИМЕНОВАНИЕ ПРИБОРА')
    

    def __str__(self):
        return f"{self.registry_number} {self.title}"

    class Meta:
        verbose_name = 'Номер Реестра'
        verbose_name_plural = 'Справочник Номера реестра'

class Type(MPTTModel):
    tip = models.CharField(max_length=255, verbose_name="Тип/модификация прибора", unique=True, help_text='Введите согласно госреестру Тип СИ и сохраните его, если предусмотрены МОДИФИКАЦИИ, ' \
    'повторно, в этоже поле, занесите название Модификации с указанием "РОДИТЕЛЬСКОГО" ТИПа', error_messages={'unique': 'Повтор! Данные уже занесены'})
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children', db_index=True, verbose_name="ссылка на родительский тип",
                            help_text='При вводе МОДИФИКАЦИИ сошлитесь из указанного списка на "РОДИТЕЛЬСКИЙ" ТИП')
    
          
    class MPTTMeta:
        # сортировка по полю
        order_insertion_by = ['tip']
        level_attr = '1'

    class Meta:
        verbose_name = "Тип и модификация"
        verbose_name_plural = "Справочник Типы и модификации"

    
    def __str__(self):
        return self.tip


class Gosreestr(models.Model):
    """
    Модель, представляющая сведения об утвержденных типах средств измерений.
    """

    reestr = models.ForeignKey(NumberReestr, on_delete=models.CASCADE, blank=False, verbose_name='госреестр',
                               help_text='Выберите госреестр СИ',)
    tip = models.ForeignKey(Type, verbose_name='Тип/Модиф.', on_delete=models.CASCADE, blank=False,
                             db_index=True, help_text='Выберите или занесите согласно госреестру ТИП/МОДИФ. СИ', related_name='gosreestrs',)
    mpi = models.CharField(max_length=2, choices=MPI, verbose_name='межповерочный интервал', default=12)
    description = models.TextField(max_length=150, verbose_name='Примечание (комментарий)', null=True, blank=True)
    
    def __str__(self):
        return f"{self.reestr} {self.tip} {self.mpi}"

    class Meta:
        verbose_name = 'Госреестр'
        verbose_name_plural = 'Госреестры'

        # это ограничение на уровне базы данных, которое позволяет гарантировать уникальность значений полей модели
        # в базе данных. Оно гарантирует, что в базе данных не будет записей, в которых значения полей совпадают
        constraints = [
            models.UniqueConstraint(
                fields=['reestr', 'tip', 'mpi'], name='unique_reestr'
            )
        ]


class Pribor(models.Model):
    """Таблица КАРТОЧКА ПРИБОРА"""

    grsi = models.ForeignKey(Gosreestr, verbose_name='ГРСИ', on_delete=models.CASCADE,
                             blank=False, db_index=True, related_name='pribors')
    factory_number = models.CharField(verbose_name='Заводской номер', max_length=30, null=True, blank=True,
                                      db_index=True)
    
    def __str__(self):
        return f"{self.pk} {self.grsi} {self.factory_number}"


    class Meta:
        verbose_name = 'Карточка прибора'
        verbose_name_plural = 'Карточки приборов'

views.py

from django.shortcuts import render
from .models import *

def pribor_list(request):
    pribors = Pribor.objects.order_by('grsi__reestr__title',
                                      'grsi__tip__tip',
                                      '-grsi__reestr__registry_number',)

    context = {'pribors': pribors,}

    return render(request, 'PriborList.html', context)

PriborList.html

<table class="table">
    <thead>
        <tr>
            <th>№</th>
            <th>№ ГРСИ</th>
            <th>Наименование СИ</th>
            <th>Тип</th>
            <th>Модиф.</th>
            <th>Заводской номер</th>
        </tr>
    </thead>
    <tbody>
        {% for pribor in pribors %}        
        <tr>
            
            <!-- Текущая итерация цикла (начинается с индекса 1) - сквозная номерация  -->
            <td>{{ forloop.counter }}</td>
            <!--  -->
            <td>{{ pribor.grsi.reestr.registry_number }}</td>
            <td>{{ pribor.grsi.reestr.title }}</td>
        
            <!-- Получение родителя (тип прибора) -->
            
            <td>{{node.tip}}</td>
            <td>{{ pribor.grsi.tip }}</td>
            <td>{{ pribor.factory_number }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>

введите сюда описание изображения введите сюда описание изображения

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