Как агрегировать оценку по значению поля manytomany в кверисете django
class Subject(models.Model):
name = models.CharField(max_length=100, blank=True, null=False)
category = models.CharField(choices=TYPE_CHOICES, null=True, max_length=50)
setting = models.ManyToManyField(Contact)
class Contact(models.Model):
name = models.CharField(max_length=50, blank=True, null=True)
email = models.EmailField(max_length=50, blank=True)
id | subject_id | contact_id |
---|---|---|
1 | 66 | 13 |
2 | 66 | 28 |
3 | 71 | 13 |
4 | 71 | 28 |
5 | 98 | 13 |
6 | 98 | 28 |
7 | 98 | 37 |
8 | 20 | 13 |
Поле setting является свойством manytomany, и оно может иметь несколько значений setting на объект subject. Результат, который я хочу получить, - это оценка по contact_id. Оценка рассчитывается следующим образом.
1. 50 points per subject object.
2. If two people are in charge of a subject, each person gets 25 points, and if three people are in charge of a subject, each person gets 16 (50/3) points.
Desired result: {'contact_id': 13, 'score': 91}, {'contact_id': 28, 'score': 41}, {'contact_id': 37, 'score': 16}
workers = Subject.objects.filter(setting__isnull=False)\
.values('id')\
.annotate(worker=Count('setting'))
setting_performance = Subject.objects.filter(setting__isnull=False) \
.values('setting')\
.annotate(
setting=Count('id', filter=Q(id__in=workers.filter(worker=1).values('id')), distinct=True) * Value(50),
collabo_setting=Count('id', filter=Q(id__in=workers.filter(worker__gte=2).values('id')), distinct=True) * Value(50) / workers.filter(id=F('id')).values('worker'),)\
.values_list('setting__name', 'setting', 'collabo_setting')
Приведенное выше выражение - это код, который я написал. Оно не является корректным. Есть отзывы о django и вычислениях queryset?