Django Coalesce ile sorgularda default value

Annotation ve aggregation yaparken calistirilan sorgu sonucunda DB’den herhangi bir kayit donmez ise sonuc olarak None doner. Biz bu donen degeri uzerinde sayisal bir islem yapmak istedigimizda hata aliriz.

total_price = Product.objects.filter(category_id=1).aggregate(
    total_price=Sum('price')
)['total_price']
mytotal += total_price
// TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

Sorgudan deger donmedigi durumda None yerine 0 donmesini istersek Coalesce kullanabiliriz.

from django.db.models.functions import Coalesce
total = Product.objects.filter(category_id=1).aggregate(
    total_price=Coalesce(Sum('price'), 0)
)['total_price']

Mesela iki fieldi F ile toplama yapiyorsak ve fieldin birinin sonucu None donerse toplama da yapamaz. O yuzden Coalesce kullanmak onemli.

Mesela burda execution’in hic incomi yoksa None donucektir. Sayi - None = None olacaktir.

flat_period_executions = FlatPeriodExecution.objects.annotate(
    total_debit=F('amount') - Sum(F('incomes__amount'))
).all()

# Soyle olmasi lazim
flat_period_executions = FlatPeriodExecution.objects.annotate(
    total_debit=F('amount') - Coalesce(Sum(F('incomes__amount')), 0)
).all()

Load comments