Нужна помощь с написанием запроса к БД на Django
Изначально есть две модели - "Client" и "Creditor".
class Client(models.Model):
first_name = models.CharField('Имя', max_length=100)
second_name = models.CharField('Фамилия', max_length=100)
patronymic = models.CharField('Отчество', max_length=100)
birth_date = models.CharField('Дата рождения', max_length=100)
creditor = models.ManyToManyField('Creditor', through='ClientCreditorThrough')
# должна выводиться сумма долга, подсчитанная как сумма долгов от всех кредиторов
def __str__(self):
return f'{self.first_name} {self.second_name}'
class Creditor(models.Model):
name = models.CharField('Наименование', max_length=300)
address = models.CharField('Адрес', max_length=400)
taxpayer_number = models.PositiveIntegerField('ИНН')
def __str__(self):
return self.name
Они связаны между собой через ManyToManyfield. Первой задачей было собрать всех должников конкретного банка и все банки, в которых конкретный должник брал кредиты - с этим проблем не возникло. Но затем в промежуточную таблицу модели ClientCreditorThrough было добавлено поле "debt_sum" - сумма долга.
class ClientCreditorThrough(models.Model):
client = models.ForeignKey(Client, on_delete=models.SET_DEFAULT,
default='Нет кредитора')
creditor = models.ForeignKey(Creditor, on_delete=models.DO_NOTHING)
debt_sum = models.PositiveIntegerField()
То есть, теперь в промежуточной таблице есть связь между клиентом, кредитором и суммой долга конкретного клиента перед конкретным кредитором. Проблема в том, что не могу понять, как правильно сформировать во вью-классе запрос, который позволит потом в html-шаблон вывести для конкретного клиента сразу название его кредитора и сумму долга.
Вот имеющийся вью-класс:
class ClientDetailView(DetailView):
model = Client
template_name = 'clients/client_detail.html'
context_object_name = 'client'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
through_object = ClientCreditorThrough.objects.filter(client_id=self.kwargs['pk'])
context['through'] = through_object
# получен QuerySet из промежуточных объектов для конкретного клиента,
# но имени кредитора в нем нет, а есть только цифра - id. Как его вытащить?
return context
По идее, нужен запрос, который вернет QuerySet, содержащий наименование кредитора и сумму долга - и их потом можно будет "распаковать" в шаблоне через директиву {% for %}. Но как создать такой QuerySet - никак не соображу. Из объекта модели ClientCreditorThrough можно получить сумму долга, если обратиться к объекту по типу "объект.debt_sum", но невозможно получить название кредитора, т.к. в таблице ClientCreditorThrough зашиты просто цифры-id кредитора, которые отсылают к таблице с самими кредиторами. Нужно до их названий как-то дотянуться. Помогите, пожалуйста, с этим (вид промежуточной таблицы - на скрине).
Ну, ты можешь получить имена, если в модели ClientCreditorThrough переопределишь метод str и напишешь:
return f'{self.creditor.name} - {self.client}'