Как агрегировать оценку по значению поля 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?

Вернуться на верх