Показать все пункты счета-фактуры - django

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

У меня есть две модели:

class Invoice(models.Model):

    PAYMENT_OPTIONS = (
        ('CASH', _('CASH')),
        ('DEPOSIT', _('DEPOSIT')),
        ('CARD', _('CARD')),
    )

    INVOICE_TYPE = (
        ('Service', _('Service')),
    )

    invoice_number = models.CharField(max_length=7, unique=True, default='INV4898')
    invoice_user = models.ForeignKey(Account, on_delete=models.CASCADE)
    invoice_type = models.CharField(max_length=30, choices=INVOICE_TYPE, default='Service')
    payment_option = models.CharField(max_length=30, choices=PAYMENT_OPTIONS)
    invoice_name = models.CharField(max_length=30, null=True, blank=True)
    vat = models.CharField(max_length=9, blank=True, null=True)
    gross_amount = models.DecimalField(max_digits=6, decimal_places=2)
    vat_amount = models.DecimalField(max_digits=6, decimal_places=2)
    net_amount = models.DecimalField(max_digits=6, decimal_places=2)
    created_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
      return f"{self.invoice_user.first_name} {self.invoice_user.last_name} - {self.invoice_number}"

class Item(models.Model):

    invoice = models.ForeignKey(Invoice, related_name='items', on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    quantity = models.IntegerField(default=1)
    unit_price = models.DecimalField(max_digits=6, decimal_places=2, default=Decimal('0.00'))
    net_amount = models.DecimalField(max_digits=6, decimal_places=2, default=Decimal('0.00'))
    vat_rate = models.CharField(max_length=10, default=0)
    discount = models.DecimalField(max_digits=6, decimal_places=2, default=Decimal('0.00'))
    is_paid = models.BooleanField(default=False)
    created_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
      return f"{self.invoice.invoice_number}"

В файле views.py у меня есть представление в виде списка, в котором я пытаюсь получить список всех счетов на основе номера счета_фактуры и затем сопоставить каждый номер счета_фактуры со счетом в items. Однако при использовании приведенного ниже кода первая печать выводит все номера_фактур, а вторая печать выводит все элементы для всех счетов, а не элементы для каждого счета.

def list_invoices(request, userprofile_id):
    user_profile = get_object_or_404(Account, pk=userprofile_id)
    all_invoices =Invoice.objects.filter(invoice_user=user_profile)

    invoice_number = Invoice.objects.values_list('invoice_number')
    print(invoice_number)
    
    item_invoice = Item.objects.filter(invoice__invoice_number__in=invoice_number)
    print(item_invoice)


    context = {
        'all_invoices': all_invoices,
        'user_profile': user_profile,
        'item_invoice': item_invoice,
    }
    return render(request, 'invoices/list-invoices.html', context)

Буду благодарен за любую помощь.

Вам не нужно передавать Items не invoice_number из Invoice. Вам нужно передать только счета user_profile, и, возможно, лучше также предварительно получить Items:

def list_invoices(request, userprofile_id):
    user_profile = get_object_or_404(Account, pk=userprofile_id)
    all_invoices = Invoice.objects.filter(
        invoice_user=user_profile
    ).prefetch_related('items')

    context = {
        'all_invoices': all_invoices,
        'user_profile': user_profile
    }
    return render(request, 'invoices/list-invoices.html', context)

в шаблоне можно обратиться к .items, так:

<ul>
{% for invoice in all_invoices %}
    <li> {{ invoice.invoice_number }}</li>
    <ul>
    {% for item in invoice.items.all %}
        <li>{{ item.quantity }} {{ item.title }}</li>
    {% endfor %}
    </ul>
{% endfor %}
</ul>
Вернуться на верх