django-запрос: получение родительского значения на основе дочернего поля

#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, но именно так я получил данные, и теперь это немного поздно / сложно изменить