Throwing ZeroDivisionError - PullRequest
0 голосов
/ 30 мая 2018

Мне нужно вычислить некоторые данные, поэтому в аннотации я добавляю математическую логику с другим полем, но всякий раз, когда есть 0, она выдает ошибку.Мне нужно обработать эту ошибку в аннотации.Мой код выглядит следующим образом:

total_amount = Invoice.objects.filter(client_account__account_UID=account_UID,
                                              created_at__range=(from_date, to_date)
                                              ).aggregate(Sum('total_amount'))['total_amount__sum']

total_billable_leads = CampaignContact.objects.filter(campaign=campaigns, billable=True, billable_item__created_at__range=(from_date, to_date)).count()

cch = CampaignContactHistory.objects.annotate(
            campaign_name=F('campaign__name')
                 ).values('campaign_name'
                 ).filter(id__in=cch_ids
                 ).annotate(
            total=Count('lead_status'),
            scheduled=Count(Case(When(lead_status='10', then=1))),
            total_billable=(int(total_amount) / total_billable_leads) * Count(Case(When(campaign_contact__billable=True, then=1))),
        )

В total_billable есть переменная total_billable_leads, которая может иметь ноль (0), тогда при делении она выдаст ошибку.Поэтому, пожалуйста, помогите мне обработать это исключение в аннотации.

CampaignContactHistory Модель

class CampaignContactHistory(DateAwareModel):
    campaign_contact = models.ForeignKey(CampaignContact, on_delete=models.CASCADE)
    lead_status = models.CharField(max_length=20, choices=leadstatus, default=FRESH)
    campaigner = models.ForeignKey(Resource, on_delete=models.CASCADE)
    response_date = models.DateTimeField(null=True, blank=True)
    first_reponse = models.TextField(blank=True, null=True, default='')
    second_reponse = models.TextField(blank=True, null=True, default='')
    campaign = models.ForeignKey(Campaign, null=True, blank=True)

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

1 Ответ

0 голосов
/ 30 мая 2018

total_amount и total_billable_leads являются константами, поэтому вы получаете ошибку на уровне Python, поэтому решение:

if total_billable_leads:
    total_amount_avg = int(total_amount) / total_billable_leads
else:
    total_amount_avg = 0

cch = CampaignContactHistory.objects.annotate(
            campaign_name=F('campaign__name')
                 ).values('campaign_name'
                 ).filter(id__in=cch_ids
                 ).annotate(
            total=Count('lead_status'),
            scheduled=Count(Case(When(lead_status='10', then=1))),
            total_billable=total_amount_avg * Count(Case(When(campaign_contact__billable=True, then=1))),
            #               ^^^^^^^^^^^^^^^
        )
...