Monday 9 August 2021

DRF Serializer How do I serialize my data and display

I have following Serializer I am facing problem with Json with serializing. I have user named daniel james and he have multiple subject like maths science I am providing nested serializer to fill all subject but based on subject users name also repeats below is more specific qsn

This is my model.

class Result(BaseModel):
    semester_choices = (
        ('first', 'First'),
        ('second', 'Second'),
        ('third', 'Third'),
        ('fourth', 'Fourth'),
        ('fifth', 'Fifth'),
        ('sixth', 'Sixth'),
        ('seventh', 'Seventh'),
        ('eight', 'Eight'),
        ('all', 'All'),
    )
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    registration_number = models.CharField(null=True, blank=True, max_length=20)
    semester = models.CharField(max_length=50, choices=semester_choices, null=True, blank=True)
    gpa = models.CharField(max_length=20)
    subject = models.CharField(max_length=50)

serializers.py

 class ResultSerializer(serializers.ModelSerializer):
    class Meta:
        model = Result
        fields = '__all__'

class ListResultSerializer(ResultSerializer):
    user = serializers.CharField()
    semester = serializers.CharField()
    subject = serializers.SerializerMethodField()

class Meta(ResultSerializer.Meta):
    fields = (
        'user',
        'semester',
        'subject',
    )

def get_subject(self, instance):
    return SubjectSerializer(instance).data

This is my SubjectSerializer

class SubjectSerializer(ResultSerializer):
    class Meta(ResultSerializer.Meta):
        fields = (
            'gpa',
            'subject'
        )

And In my views.py I have done like this.

class ListResultView(rest_generics.ListAPIView, UserMixin):
    serializer_class = serializers.ListResultSerializer
    permission_classes = (AllowAny,)

    def get_object(self):
        return self.get_user()

    def get_queryset(self):
        return usecases.ListResultUseCase(
            user=self.get_user()
        ).execute()

I use usecases.py to filter the data here is further code

class ListResultUseCase:
    def __init__(self, user: User):
        self._user = user

    def execute(self):
        self._factory()
        return self._result

    def _factory(self):
        self._result = Result.objects.filter(user=self._user)

Now this is the Json I am getting right now from above code.

[
    {
        "user": "daniel james",
        "semester": "first",
        "subject": {
            "gpa": "a+",
            "subject": "maths"
        }
    },
    {
        "user": "daniel james",
        "semester": "first",
        "subject": {
            "gpa": "A",
            "subject": "data structures"
        }
    }
]

I want my json to be in this format

 [
  {
    "user": "daniel james",
    "semester": "first",
    "subject": [
      {
        "gpa": "a+",
        "subject": "maths"
      },
      {
        "gpa": "A",
        "subject": "data structures"
      }
    ]
  }
]

Any help in serializer?



from DRF Serializer How do I serialize my data and display

No comments:

Post a Comment