I am using DRF's ModelSerializer and Nested relationships. 

Problem:

The ModelSerializer, ProcedureSerializer when displayed shows all the 
custom fields defined on it correctly. However, when ProcedureSerializer is 
nested into customerSerializer, the fields of ProcedureSerializer shown are 
only those original fields defined in its model, and it loses the custom 
defined fields.

The issue is that in nested modelserializer, some of the fields defined on, 
and visible on listing the nested serializer do not show up when listing 
the parent.

Models:

    class customer(models.Model):
        cstid = models.AutoField(primary_key=True, unique=True)
        name = models.CharField(max_length=35, blank=False)
        ...SNIPPED

        class Meta:
            unique_together = ["name", "mobile", "linkedclinic"]
            ordering = ['name']

        def __str__(self):
            return self.name    
        
    class Procedure(models.Model):
        procid = models.AutoField(primary_key=True, unique=True)
        timestr = models.DateTimeField(default=timezone.now)
        template = models.ForeignKey(
            ProcedureTemplate, on_delete=models.CASCADE, blank=True, 
null=True)
        clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE)
        doctor = models.ForeignKey(
            doctor, on_delete=models.SET_NULL, blank=True, null=True)
        customer = models.ForeignKey(
            customer, on_delete=models.CASCADE, null=False, 
related_name='procedures')

        def __str__(self):
            return f'{self.template} for {self.customer} on {self.timestr}'

        def eventtime(self):
            class_date = timezone.localtime(self.timestr)
            return class_date.strftime("%d-%m-%Y %I:%M %p")    
    
Serializers:
    
    class FindingSerializer(serializers.ModelSerializer):
        class Meta:
            model = Finding
            depth = 1
            fields = [
                'fid',
                'fieldheading',
                'value',
                'linkedprocedure',
            ]
            
    class ProcedureSerializer(serializers.ModelSerializer):
        finding_proc = FindingSerializer(many=True, read_only=True)
        
        class Meta:
            model = Procedure
            depth = 2
            fields = [
                'procid',
                'timestr',
                'template',
                'clinic',
                'doctor',
                'customer',
                'eventtime',
                'finding_proc',
            ]
            
    class customerSerializer(ConvertNoneToStringSerializerMixin, 
serializers.ModelSerializer):
        def get_unique_together_validators(self):
            """Overriding method to disable unique together checks"""
            return []

        class Meta:
            model = customer
            depth = 3
            biovar_data = Biovariable_dataSerializer(
                read_only=True, many=True)  # many=True is required
            procedures = ProcedureSerializer(
                read_only=True, many=True)  # many=True is required
            # allergies = allergiesSerializer(
            #     read_only=True, many=True)  # many=True is required
            fields = [
                'cstid',
                'date_of_registration',
                'insurance_number',
                'name',
                'age',
                'ageyrs',
                'agemnths',
                'dob',
                'gender',
                'maritalstatus',
                'mobile',
                'alternate',
                'email',
                'address',
                'city',
                'occupation',
                'bloodgroup',
                'linkedclinic',
                'allergies_data',
                'biovar_data',
                'procedures'
            ]
            validators = []
            none_to_str_fields = ('insurance_number', )

If I display a procedure instance: `GET /api/procedures/209/`, All the 
required fields show up:
    
    HTTP 200 OK
    Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
    Content-Type: application/json
    Vary: Accept

    {
        "procid": 209,
        "timestr": "2022-02-02T17:23:55.048232+05:30",
        "template": 1,
        "clinic": 21,
        "doctor": 4,
        "customer": 5596,
        "eventtime": "02-02-2022 05:23 PM",
        "finding_proc": [
            {
                "fid": 1423,
                "fieldheading": {
                    "procid": 5,
                    "name": "Nasal mucosa",
                    "default": "Nasal mucosa appears normal.",
                    "sortorder": 1,
                    "fieldtype": "heading1",
                    "template": 1
                },
                "value": "",
                "linkedprocedure": {
                    "procid": 209,
                    "timestr": "2022-02-02T17:23:55.048232+05:30",
                    "template": 1,
                    "clinic": 21,
                    "doctor": 4,
                    "customer": 5596
                }
            },
            {
                "fid": 1424,
                "fieldheading": {
                    "procid": 6,
                    "name": "Turbinates",
                    "default": "Bilateral inferior, middle and superior 
turbinates appear normal.",
                    "sortorder": 15,
                    "fieldtype": "heading1",
                    "template": 1
                },
                "value": "Left MT bulky, suggestive of concha bullosa",
                "linkedprocedure": {
                    "procid": 209,
                    "timestr": "2022-02-02T17:23:55.048232+05:30",
                    "template": 1,
                    "clinic": 21,
                    "doctor": 4,
                    "customer": 5596
                }
            },
            {
                "fid": 1425,
                "fieldheading": {
                    "procid": 7,
                    "name": "Septum",
                    "default": "No significant nasal septal deviation.",
                    "sortorder": 5,
                    "fieldtype": "heading1",
                    "template": 1
                },
                "value": "",
                "linkedprocedure": {
                    "procid": 209,
                    "timestr": "2022-02-02T17:23:55.048232+05:30",
                    "template": 1,
                    "clinic": 21,
                    "doctor": 4,
                    "customer": 5596
                }
            },
            {
                "fid": 1426,
                "fieldheading": {
                    "procid": 8,
                    "name": "Middle meatus",
                    "default": "Bilateral middle meatus normal. No 
discharge, or polyps.",
                    "sortorder": 50,
                    "fieldtype": "heading1",
                    "template": 1
                },
                "value": "",
                "linkedprocedure": {
                    "procid": 209,
                    "timestr": "2022-02-02T17:23:55.048232+05:30",
                    "template": 1,
                    "clinic": 21,
                    "doctor": 4,
                    "customer": 5596
                }
            },
            {
                "fid": 1427,
                "fieldheading": {
                    "procid": 9,
                    "name": "Inferior Meatus",
                    "default": "Inferior Meatus is normal. Opening of 
Hasner's valve normal.",
                    "sortorder": 30,
                    "fieldtype": "heading1",
                    "template": 1
                },
                "value": "Nasopharynx shows adenoid enlargement, occupying 
less than 2/3rd of the posterior choana.",
                "linkedprocedure": {
                    "procid": 209,
                    "timestr": "2022-02-02T17:23:55.048232+05:30",
                    "template": 1,
                    "clinic": 21,
                    "doctor": 4,
                    "customer": 5596
                }
            },
            {
                "fid": 1428,
                "fieldheading": {
                    "procid": 10,
                    "name": "Sphenoethmoidal recess",
                    "default": "Bilateral sphenoethmoidal recesses normal",
                    "sortorder": 60,
                    "fieldtype": "heading1",
                    "template": 1
                },
                "value": "",
                "linkedprocedure": {
                    "procid": 209,
                    "timestr": "2022-02-02T17:23:55.048232+05:30",
                    "template": 1,
                    "clinic": 21,
                    "doctor": 4,
                    "customer": 5596
                }
            },
            {
                "fid": 1429,
                "fieldheading": {
                    "procid": 11,
                    "name": "Final Impression",
                    "default": "Nasal endoscopy normal",
                    "sortorder": 1000,
                    "fieldtype": "heading1",
                    "template": 1
                },
                "value": "Adenoid hypertrophy noted",
                "linkedprocedure": {
                    "procid": 209,
                    "timestr": "2022-02-02T17:23:55.048232+05:30",
                    "template": 1,
                    "clinic": 21,
                    "doctor": 4,
                    "customer": 5596
                }
            }
        ]
    }    

But, if I try to view the serializer customerSerializer which nests 
ProcedureSerializer, all the fields of ProcedureSerializer do not show up:
    
    `GET /api/customer/5596/`

    {
        "cstid": 5596,
        "name": "Some name",
        "age": "10yr",
        "ageyrs": 9,
        SNIPPED
        "linkedclinic": {},
        "procedures": [
            {
                "procid": 209,
                "timestr": "2022-02-02T17:23:55.048232+05:30",
                "template": {
                    "templid": 1,
                    "title": "DNE",
                    "description": "Diagnostic Nasal Endoscopy",
                    "clinic": {
                        "clinicid": 10,
                        "SNIP
                    }
                },
                "clinic": {
                    "clinicid": 21,
                    SNIP
                },
                "doctor": {
                    "docid": 4,
                    SNIP
                },
                "customer": {
                    "cstid": 5596,
                    "date_of_registration": "2021-12-25",
                    SNIP
                    }
                }
            }
        ]
    }

Thus, it is noted that two of those fields which are there in 
ProcedureSerializer, including eventtime (which is actually a model method) 
and finding_proc (which is a nested serializer) are missing from 
ProcedureSerializer.

    repr(ProcedureSerializer()) gives:

    "ProcedureSerializer():\n    procid = IntegerField(read_only=True)\n   
 timestr = DateTimeField(required=False)\n    template = 
PrimaryKeyRelatedField(allow_null=True, 
queryset=ProcedureTemplate.objects.all(), required=False)\n    clinic = 
PrimaryKeyRelatedField(queryset=Clinic.objects.all())\n    doctor = 
PrimaryKeyRelatedField(allow_null=True, queryset=doctor.objects.all(), 
required=False)\n    customer = 
PrimaryKeyRelatedField(queryset=customer.objects.all())\n    eventtime = 
ReadOnlyField()\n    finding_proc = FindingSerializer(many=True, 
read_only=True):\n        fid = IntegerField(read_only=True)\n       
 fieldheading = NestedSerializer(read_only=True):\n            procid = 
IntegerField(read_only=True)\n            name = 
CharField(max_length=200)\n            default = 
CharField(max_length=1000)\n            sortorder = 
IntegerField(max_value=2147483647, min_value=-2147483648, required=False)\n 
           fieldtype = ChoiceField(choices=(('heading1', 'Heading1'), 
('heading2', 'Heading2')), required=False)\n            template = 
PrimaryKeyRelatedField(queryset=ProcedureTemplate.objects.all())\n       
 value = CharField(allow_blank=True, max_length=5000, required=False)\n     
   linkedprocedure = NestedSerializer(read_only=True):\n            procid 
= IntegerField(read_only=True)\n            timestr = 
DateTimeField(required=False)\n            template = 
PrimaryKeyRelatedField(allow_null=True, 
queryset=ProcedureTemplate.objects.all(), required=False)\n           
 clinic = PrimaryKeyRelatedField(queryset=Clinic.objects.all())\n           
 doctor = PrimaryKeyRelatedField(allow_null=True, 
queryset=doctor.objects.all(), required=False)\n            customer = 
PrimaryKeyRelatedField(queryset=customer.objects.all())"
    
What is happening here? How can I get all fields in the nested parent 
serializer?

-- 
You received this message because you are subscribed to the Google Groups 
"Django REST framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-rest-framework+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-rest-framework/27b49263-ec8f-4ab8-aa66-0e46c61fc0e2n%40googlegroups.com.

Reply via email to