#django #django-queryset
#django #django-queryset
Вопрос:
Прошу прощения, если я не совсем понимаю запрос, который я пытаюсь создать, на основе следующих моделей:
class BankingDetail(models.Model):
sfAttachmentID = models.CharField(max_length=18, unique = True)
created = models.DateTimeField(auto_now_add=True)
class TransactionBankDetail(models.Model):
bankingDetail = models.ForeignKey(BankingDetail, on_delete=models.CASCADE, related_name='BankingDetails')
institution = models.TextField(blank=True, unique = False, null=True)
Я пытаюсь найти, какие учреждения у меня есть и сколько их. Однако, поскольку 1 BankingDetail может иметь несколько TransactionBankDetail, я хочу подсчитать эти значения только один раз. Другими словами, на основе моего запроса:
#institution_by_attachments = TransactionBankDetail.objects.filter(institution__isnull=False).values('bankingDetail__sfAttachmentID', 'institution').annotate(total=1).order_by('total').reverse()
institution_by_attachments = TransactionBankDetail.objects.filter(institution__isnull=False).values('bankingDetail__sfAttachmentID', 'institution')
for i in institution_by_attachments:
print(i)
мой результат будет выглядеть так
{'bankingDetail__sfAttachmentID': '0067F0000bCRuSx', 'institution': 'Atlantic'}
{'bankingDetail__sfAttachmentID': '0067F0000bCRuSx', 'institution': 'Atlantic'}
{'bankingDetail__sfAttachmentID': '0067F0000bCRuSx', 'institution': 'Atlantic'}
{'bankingDetail__sfAttachmentID': '0067F0000bCRuSx', 'institution': 'Atlantic'}
{'bankingDetail__sfAttachmentID': 'Ost89Porque-111', 'institution': 'Atlantic'}
{'bankingDetail__sfAttachmentID': '0060p000008ieSm', 'institution': 'South Pacific'}
{'bankingDetail__sfAttachmentID': '0060p000008ieSm', 'institution': 'South Pacific'}
{'bankingDetail__sfAttachmentID': '0060p000008ieSm', 'institution': 'South Pacific'}
{'bankingDetail__sfAttachmentID': '0060p000008ieSm', 'institution': 'South Pacific'}
{'bankingDetail__sfAttachmentID': '0060p000008ieSm', 'institution': 'South Pacific'}
{'bankingDetail__sfAttachmentID': '0060p000008lpYC', 'institution': 'Africa'}
{'bankingDetail__sfAttachmentID': '0060p000008lpYC', 'institution': 'Africa'}
{'bankingDetail__sfAttachmentID': '0060p000008lpYC', 'institution': 'Africa'}
{'bankingDetail__sfAttachmentID': '12365478987test123', 'institution': 'South Pacific'}
{'bankingDetail__sfAttachmentID': '12365478987test123', 'institution': 'South Pacific'}
{'bankingDetail__sfAttachmentID': '12365478987test123', 'institution': 'South Pacific'}
Если я использую это для своего агрегата, я получу неправильные результаты:
Atlantic 5
South Pacific 8
Africa 3
Чего я хочу, так это:
South Pacific 2
Atlantic 2
Africa 1
Комментарии:
1. Я думаю, вы могли бы использовать
distinct()
сначала и после этогоannotate(Count('institution')
. Я не понимаю вашу проблему в деталях. Хотели бы вы устранить дубликаты, например'bankingDetail__sfAttachmentID'
, и получить только количество разныхBankingDetails
отношений? различать и подсчитывать2. @KlimBim да, я хочу удалить дубликаты, текущий запрос сбрасывает Atlantic 5, последняя таблица — результат моего желания, Atlantic должно быть 2, потому что из 5 записей они имеют только 2 уникальных идентификатора для bankingDetail__sfAttachmentID, я думаю, что в идеальном мире учреждение должно было быть вBankingDetail отсутствует в TransactionBankDetail, но именно так я получил данные, и теперь это немного поздно / сложно изменить