Как я могу получить предыдущий экземпляр объекта в шаблонах Django динамически?

У меня есть **model**, которая аккумулирует большинство других моделей для отображения отчета.

class IpdReport(models.Model):
    patient=models.ForeignKey(Patient, on_delete=CASCADE)
    package=models.ForeignKey(Package, on_delete=CASCADE, blank=True, null=True)
    receivables=models.ForeignKey(Receivables, on_delete=CASCADE, blank=True, null=True)
    discharge=models.ForeignKey(Discharge, on_delete=CASCADE, blank=True, null=True)
    realization=models.ForeignKey(Realization, on_delete=CASCADE, blank=True, null=True)
    lockdata=models.ForeignKey(LockData, on_delete=CASCADE, blank=True, null=True)

Как вы видите, большинство из fields являются необязательными.

filters.py

class IpdFilters(django_filters.FilterSet):
    patient__name=django_filters.CharFilter(lookup_expr='icontains', label='Name')
    package__patient_type__patient_type=django_filters.CharFilter(lookup_expr='icontains', label='Type of Patient')
    realization__amount_received__gt=django_filters.NumberFilter(field_name='realization__amount_received', lookup_expr='gt', label='Min. Amount Received')
    realization__amount_received__lt=django_filters.NumberFilter(field_name='realization__amount_received', lookup_expr='lt', label='Max. Amount Received')
    from_date=django_filters.DateFilter(widget=forms.DateInput(attrs={'id': 'from'}), field_name='package__date_of_admission', label='From - Date of Admission ', lookup_expr='gte')
    to_date=django_filters.DateFilter(widget=forms.DateInput(attrs={'id': 'to'}), field_name='package__date_of_admission', label='To - Date of Admission ', lookup_expr='lte')
    class Meta:
        model=IpdReport
        fields={
            'realization__cash':['exact']
        }

Я хочу, чтобы, когда context передает экземпляр в template, template мог получить доступ к предыдущему экземпляру, содержащему тот же patient, чтобы я мог использовать его для отображения определенного текста в одном из table-data на основе условия, которое я поставил.

Я пробовал что-то вроде:

views.py

def ipd_report_view(request):
    report=IpdReport.objects.all().order_by('id')
    myFilter=IpdFilters(request.POST, queryset=report)
    report=myFilter.qs
    lst=[]
    temp_lst=[]
    for indie in report:
        prev=IpdReport.objects.filter(patient=indie.patient).order_by('id')
        print('prev ka value: ', prev)
        for chu in prev:
            if chu not in lst:
                lst.append(chu)
                ln=len(lst)
                for i in range(0, ln):
                    if i not in temp_lst:
                        temp_lst.append(i)
                        pitch=prev[:ln-1]
    total1=report.aggregate(Sum('realization__amount_received'))
    total2=report.aggregate(Sum('realization__deficit_or_surplus_amount'))
    context={'report': report, 'total1':total1, 'total2':total2, 'myFilter':myFilter, 'previous':lst, 'len':temp_lst, 'siz':ln}
    return render(request, 'account/ipdreport.html', context)

А **template** - это что-то вроде:

{% for rp in report %}
    {% elif rp.realization %}
        {% for ln in len|slice:"1:siz" %}
            {% for prev in previous|slice:":ln|sub:1" %}
                {% with previd=prev.id|sub:1 %}
                    {% if previd %}
                        {% if prev.realization %}
                            {% if prev.realization.cash == False %}
                                {% if prev.realization.deficit_or_surplus_amount < 0 %}
                                    Repudiated/
                                {% endif %}
                            {% endif %}
                        {% endif %}
                    {% endif %}
                {% endwith %}
            {% endfor %}
        {% endfor %}
    {% endif %}
{% endfor %}

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

Я хочу донести до него, что когда в текущем экземпляре есть realization и если у него есть предыдущий экземпляр с тем же patient и если предыдущий тоже имеет данные realization и его realization.cash равен False, ТО, если текущий realization.deficit_or_surplus_amount имеет отрицательное значение, то вывести нужный текст в соответствующем td.

Есть ли другой способ достичь этого или мне нужно внести некоторые изменения в текущую логику? Пожалуйста, помогите.

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