Django Rest Framework: получение обратного количества объектов на основе поля ManyToMany - PullRequest
0 голосов
/ 19 февраля 2020

Как мне сериализовать поле ManyToMany и вернуть количество объектов на основе этого поля? В моем примере ниже я сериализую объект Admission и могу получить весь диагноз, связанный с объектом. Но я застрял на том, как подсчитать количество поступающих предметов на основе значения в диагнозе.

[
    {
        "doctor_id": 7,
        "diagnosis": [
            "Acute encephalopathy",
            "Brachial neuritis"
        ]
    },
    {
        "doctor_id": 7,
        "diagnosis": [
            "Acute febrile illness"
        ]
    }
]

Как мне изменить это, чтобы получить количество объектов на основе поля диагноз ?

Я хочу получить результат API, подобный следующему:

[
    {
        "Acute febrile illness": 1
    },
    { 
        "Acute encephalopathy + Brachial neuritis": 1
    }
]

models.py

class Admission(models.Model):
    ...
    diagnosis = models.ManyToManyField(Diagnosis)
    doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE,
                               related_name='admissions',
                               limit_choices_to={'is_admitting': True})
    ...

class Diagnosis(models.Model):
    ...
    name = models.CharField(max_length=100)
    ...

serializers.py

class DiagnosisSerializer(serializers.ModelSerializer):
    class Meta:
        model = Diagnosis
        fields = ('name',)

    def to_representation(self, value):
        return value.name

class AdmissionSerializer(serializers.ModelSerializer):
    diagnosis = DiagnosisSerializer(read_only=True, many=True)

    class Meta:
        model = Admission
        fields = ('doctor_id', 'diagnosis' )

views.py

class AdmissionViewSet(viewsets.ModelViewSet):
    queryset = Admission.objects.all()
    serializer_class = AdmissionSerializer
    filter_backends = (filters.DjangoFilterBackend, )
    filterset_fields = ('doctor__id', )
...