Django Передача данных поля таблицы в сериализатор

У меня есть следующие модели:

class Disease(models.Model):
    name = CICharField("Disease Name", max_length=200, unique=True)
    symptoms = models.ManyToManyField(Symptom, through='DiseaseSymptom', related_name='diseases')


class Symptom(models.Model):
    name = CICharField("Symptom Name", max_length=200, unique=True)

PRIORITY = (
    (0, 'Normal'),
    (1, 'Low'),
    (2, 'Medium'),
    (3, 'High'),
    (4, 'Key'),
)

class DiseaseSymptom(models.Model):
    disease = models.ForeignKey(Disease, on_delete=models.CASCADE, related_name='disease_to_symptom')
    symptom = models.ForeignKey(Symptom, on_delete=models.CASCADE, related_name='symptom_to_disease')
    priority = models.PositiveSmallIntegerField('Priority', choices=PRIORITY, default=0)

На фронт-энде у меня есть несколько полей выбора, где пользователи могут выбрать несколько симптомов, чтобы найти заболевание, и это будет передано в модель Disease как symptoms_selected params.

У меня есть следующий get_queryset на Disease > views.py


def get_queryset(self):
        params = self.request.query_params
        query_symptoms = self.request.GET.getlist('symptoms_selected')
        if query_symptoms:
            queryset = Pattern.objects.filter(
                symptoms__id__in=query_symptoms
            ).annotate(
                matches=Count('symptoms')
            ).order_by('-matches')
        else:
            queryset = Disease.objects.all()
    return queryset
serializer_class = DiseaseSerializer

Я использую Django REST API для передачи данных результата.


class DiseaseSerializer(serializers.ModelSerializer):
    symptoms_matches = serializers.SerializerMethodField()

    class Meta:
        model = Disease
        fields = ('id', 'name','symptoms_matches')

    def get_symptoms_matches(self, obj):
        return getattr(obj, 'matches', None)

Например: Данные о заболевании:

Болезнь А: Симптомы: A (приоритет=4), B (приоритет=2), C (приоритет=3), D (приоритет=2)

Болезнь В: Симптомы: A (приоритет=1), D (приоритет=2), P (приоритет=4), Q (приоритет=2)

>

Если пользователи выбирают 2 симптома: A, D. Я хочу, чтобы queryset возвращал количество ключевых симптомов (т.е. симптомов с приоритетом 4), сопоставленных с каждой болезнью, и сумму приоритетов симптомов в каждой болезни.

Например, если пользователь выбирает 2 симптома: A, D. Я хочу добиться того, чтобы сериализатор возвращал данные типа:

[
{
name: "Disease A"
key_symptoms_matched: 1
matched_symptoms_priority_sum: 6
}

{
name: "Disease B"
key_symptoms_matched: 0
matched_symptoms_priority_sum: 3
}

]

Может ли кто-нибудь сказать мне, как я могу этого достичь?

Я нашел способ подсчета общей суммы приоритетов симптомов в каждом заболевании

queryset = Disease.objects.filter(
                symptoms__id__in=query_symptoms
            ).annotate(
                matches=Count('symptoms')
            ).annotate(
                matched_symptoms_priority_sum =Sum('disease_to_symptom__priority')
            ).order_by('-matches','-matched_symptoms_priority_sum')

Но мне все еще нужно количество ключевых симптомов, совпадающих в каждом заболевании?

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