count livestocks by type & set in herd model by signals

This commit is contained in:
2025-10-07 12:02:30 +03:30
parent f93e48c495
commit cad4ccbe4b
4 changed files with 49 additions and 1 deletions

View File

@@ -4,3 +4,6 @@ from django.apps import AppConfig
class LivestockConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.livestock'
def ready(self):
import apps.livestock.signals

31
apps/livestock/signals.py Normal file
View File

@@ -0,0 +1,31 @@
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.db.models import Sum, Count, Q
from .models import LiveStock
def update_herd_statistics(instance: LiveStock):
"""
update light & heavy livestock number in rancher herd
"""
counts = LiveStock.objects.filter(
herd__rancher=instance.herd.rancher,
herd=instance.herd
).aggregate(
light_livestock_number=Count('id', filter=Q(weight_type='L')),
heavy_livestock_number=Count('id', filter=Q(weight_type='H'))
)
instance.herd.light_livestock_number = counts['light_livestock_number']
instance.herd.heavy_livestock_number = counts['heavy_livestock_number']
instance.herd.save(update_fields=['light_livestock_number', 'heavy_livestock_number'])
@receiver(post_save, sender=LiveStock)
def update_herd_on_livestock_save(sender, instance, **kwargs):
update_herd_statistics(instance)
@receiver(post_delete, sender=LiveStock)
def update_herd_on_livestock_delete(sender, instance, **kwargs):
update_herd_statistics(instance)