Django - dynamically update a count model field when related objects are added or removed
I've tried to research this myself but can't figure it out so I'm hoping someone may be able to offer me some direction.
I have the following 2 models:
class Group(models.Model):
short_name = models.CharField(max_length=10, primary_key=True) # company acronym
full_name = models.CharField(max_length=200)
learner_count = models.PositiveIntegerField(default=0)
contract = models.ForeignKey(Contract, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
startDate = models.DateField()
endDate = models.DateField()
notes = models.TextField(blank=True, null=True)
class Learner(models.Model):
...
group = models.ForeignKey(Group, on_delete=models.CASCADE)
Is it possible to update the learner_count field of Group dynamically as learners are added to, or removed from, a group?
I would advise not to store a Learner
count at all. You don't need to store this. The model thus looks like:
class Group(models.Model):
short_name = models.CharField(
max_length=10, primary_key=True
) # company acronym
full_name = models.CharField(max_length=200)
# learner_count = models.PositiveIntegerField(default=0)
contract = models.ForeignKey(Contract, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
startDate = models.DateField()
endDate = models.DateField()
notes = models.TextField(blank=True, null=True)
You can determine it when necessary with:
from django.db.models import Count
Group.objects.annotate(learner_count=Count('learner'))
The Group
objects arising from this Queryset
will have an extra attribute .learner_count
with the number of related Learner
records.