Getting the choice names from an array of values in Django Rest Framework

I am trying to get the choice labels from a field that stores an array of choices - I am able to get the label when the field has a single value.

Here is the model:

class TobaccoUse(models.Model):
    tu_id = models.AutoField(primary_key=True)
    patient_id_fk = models.ForeignKey('patient_management.PatientInformation', on_delete=models.CASCADE)
    SMOKING_STATUS_CHOICES = [
        ('N', 'Never Smoked'),
        ('P', 'Past Smoker'),
        ('C', 'Current Smoker')
    ]
    tu_smoking_status = models.CharField(max_length=1, choices=SMOKING_STATUS_CHOICES)
    OTHER_USE_CHOICES = [
        ('P', 'Pipe'),
        ('C', 'Cigar'),
        ('S', 'Snuff'),
        ('CH', 'Chew')
    ]
    tu_other_use = ArrayField(models.CharField(max_length=2, choices=OTHER_USE_CHOICES, null=True, blank=True), size=4, default=list, null=True, blank=True)
    tu_packs_per_day = models.DecimalField(blank=True, null=True, max_digits=4, decimal_places=1)
    tu_years_smoked = models.PositiveSmallIntegerField(blank=True, null=True)
    tu_quit_date = models.DateField(blank=True, null=True)
    tu_is_active = models.BooleanField(default=True)

The view:

class ListTobaccoUseOptions(APIView):
    def get(self, request):
        statusChoices = []
        otherChoices = []
        for ssc in TobaccoUse.SMOKING_STATUS_CHOICES:
            statusChoices.append({'label': ssc[1], 'value': ssc[0]})
        for soc in TobaccoUse.OTHER_USE_CHOICES:
            otherChoices.append({'label': soc[1], 'value': soc[0]})
        try:
            smoking_status_categories = {'status_categories': statusChoices, 'other_use_categories': otherChoices}
            return Response(smoking_status_categories, status=status.HTTP_200_OK)
        except Exception as e:
            return Response(data={'error': str(e)}, status=status.HTTP_400_BAD_REQUEST)

And the serializers:

class PatientMedicalHxSerializer(serializers.ModelSerializer):
    prognosis = serializers.SerializerMethodField()
    primary_diagnosis = serializers.SerializerMethodField()
    surgical_diagnoses = serializers.SerializerMethodField()
    secondary_diagnoses = serializers.SerializerMethodField()
    wellness_screenings = serializers.SerializerMethodField()
    tobacco_use = serializers.SerializerMethodField()
    vape_use = serializers.SerializerMethodField()

    class Meta:
        model = PatientInformation
        fields = ('primary_diagnosis', 'secondary_diagnoses', 'surgical_diagnoses', 'prognosis', 'wellness_screenings', 'tobacco_use', 'vape_use')

    def get_primary_diagnosis(self, patientinformation):
        qs = PatientToPrimaryDiagnosis.objects.filter(patient_id_fk = patientinformation, ptpd_is_active = True)
        serializer = PatientToPrimaryDiagnosisSerializer(instance = qs, many=True)
        return serializer.data
    
    def get_secondary_diagnoses(self, patientinformation):
        qs = PatientToSecondaryDiagnoses.objects.filter(patient_id_fk = patientinformation, ptsd_is_active = True)
        serializer = GetPatientToSecondaryDiagnosesSerializer(instance = qs, many=True)
        return serializer.data
    
    def get_surgical_diagnoses(self, patientinformation):
        qs = PatientToPCS.objects.filter(patient_id_fk = patientinformation, ptpcs_is_active = True)
        serializer = GetPatientSurgicalDiagnosisSerializer(instance = qs, many=True)
        return serializer.data
    
    def get_prognosis(self, patientinformation):
        qs = PatientToPrognosis.objects.filter(patient_id_fk = patientinformation, ptp_is_active = True)
        serializer = GetPatientPrognosisSerializer(instance = qs, many=True)
        return serializer.data
    
    def get_wellness_screenings(self, patientinformation):
        qs = PatientToWellnessScreenings.objects.filter(patient_id_fk = patientinformation, ws_is_active = True)
        serializer = WellnessScreeningsSerializer(instance = qs, many=True)
        return serializer.data
    
    def get_tobacco_use(self, patientinformation):
        qs = TobaccoUse.objects.filter(patient_id_fk = patientinformation, tu_is_active = True)
        serializer = TobaccoUseSerializer(instance = qs, many=True)
        return serializer.data
    
    def get_vape_use(self, patientinformation):
        qs = VapeUse.objects.filter(patient_id_fk = patientinformation, vu_is_active = True)
        serializer = VapeUseSerializer(instance = qs, many=True)
        return serializer.data

And here is the Tobacco Use serializer:

class TobaccoUseSerializer(serializers.ModelSerializer):
    status = serializers.CharField(source = 'get_tu_smoking_status_display')
    class Meta:
        model = TobaccoUse
        fields = ('__all__')    

I tried to use the get_field_display on the tu_other_use field, but it gives me an error. I'm assuming that somehow I have to loop through all of the values in the array to get the display, but I haven't figured out how to make it work.

Here is the return result so far:

[
    {
        "primary_diagnosis": [],
        "secondary_diagnoses": [],
        "surgical_diagnoses": [],
        "prognosis": [],
        "wellness_screenings": [],
        "tobacco_use": [
            {
                "tu_id": 11,
                "status": "Past Smoker",
                "tu_smoking_status": "P",
                "tu_other_use": [
                    "C"
                ],
                "tu_packs_per_day": "2.5",
                "tu_years_smoked": 8,
                "tu_quit_date": null,
                "tu_is_active": true,
                "patient_id_fk": 70
            }
        ],
        "vape_use": []
    }
]

I'd like to have a return field that has something like "other": ["Cigar", etc.]

Thanks!

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