Как я могу получить общий депозит клиентов

Я работаю над проектом Django с 2 моделями; Customer и Deposit, и я хочу отобразить список клиентов с их именами, датой внесения депозита, номером счета и общей суммой депозитов в течение года, так как мне сделать это правильно. Посмотрите, что я пробовал, но не смог получить имена клиентов в моих шаблонах Django.

Модели:

class Customer(models.Model):
    surname = models.CharField(max_length=10, null=True)
    othernames = models.CharField(max_length=20, null=True)
    account_number = models.CharField(max_length=10, null=True)
    address = models.CharField(max_length=50, null=True)
    phone = models.CharField(max_length=11, null=True)
    date = models.DateTimeField(auto_now_add=True, null=True) 

    #Get the url path of the view
    def get_absolute_url(self):
        return reverse('customer_create', args=[self.id])

    #Making Sure Django Display the name of our Models as it is without Pluralizing
    class Meta:
        verbose_name_plural = 'Customer'

#
    def __str__(self):
        return f'{self.surname} {self.othernames} - {self.account_number}' 

class Deposit(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, null=True)
    acct = models.CharField(max_length=6, null=True)
    staff = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    deposit_amount = models.PositiveIntegerField(null=True) 
    date = models.DateTimeField(auto_now_add=True)

    def get_absolute_url(self):
        return reverse('create_account', args=[self.id])

    def __str__(self):
        return f'{self.customer} Deposited {self.deposit_amount} by {self.staff.username}'

вот мой код представления:

def customer_list(request):
    #Get Current Date
    current_date = datetime.now().date()
    #Get Current Month Name from Calendar
    current_month_name = calendar.month_name[date.today().month]
    group_deposits = Deposit.objects.filter(date__year=current_date.year).order_by('acct')
    grouped_customer_deposit = group_deposits.values('acct').annotate(total `=Sum('deposit_amount')).order_by()`
context = { 'customers':grouped_customer_deposit,}

Вот как я пытался отобразить результат в Django Template:

{% for deposit in customers %}
              <tr>
                <td>{{ forloop.counter }}</td> 
                <td>{{ deposit.acct }}</td>
                <td>{{ deposit.customer.surname }}</td>
                <td>{{ deposit.total }}</td>
                <td>{{ customer.deposit.date }}</td>
                
                <th scope="row"><a class="btn btn-info btn-sm" href=" ">Deposit</a></th>
              </tr>
              {% endfor %}  

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

Вы используете метод values:

grouped_customer_deposit = group_deposits.values('acct').annotate(total `=Sum('deposit_amount')).order_by()`

Django вернет queryset, который возвращает словари, а не экземпляры моделей. Более подробную информацию смотрите в Django Queryset API reference.

Это означает, что вы не можете ссылаться на отношения вашей модели, как вы пытаетесь сделать здесь:

<td>{{ deposit.customer.surname }}</td>

поскольку эта информация не будет в словаре, передаваемом шаблону (вы можете сделать print из grouped_customer_deposit в вашем представлении, или отобразить его в вашем шаблоне - {{ customers }} - чтобы понять, что я имею в виду).

Эрго, если вы удалите вызов values(), то ваш шаблон будет получать экземпляры модели, что должно решить вашу проблему и заставить ваш шаблон работать как есть.

grouped_customer_deposit = group_deposits.annotate(total `=Sum('deposit_amount')).order_by()`

(Хотя синтаксис вашего кода annotate неправильный, поэтому я предполагаю, что это была ошибка, когда вы вставили свой код сюда)

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