Aras121
Aras121

Reputation: 91

How to create a custom API views in Django Rest Framework

I want to create a custom API view based on existing data.

models.py

class Practice(models.Model):
    practice_id = models.BigAutoField(primary_key=True)
    score = models.SmallIntegerField(null=True)
    correct = models.SmallIntegerField(null=True)
    wrong = models.SmallIntegerField(null=True)
    not_answered = models.SmallIntegerField(null=True)

    class Meta:
        managed = True
        db_table = 'practice'

    def __str__(self):
        return str(self.practice_id)

serializers.py

class PracticeSerializer(serializers.ModelSerializer):

    class Meta:
        model = Practice
        fields = ('practice_id',
                  'score',
                  'correct',
                  'wrong',
                  'not_answered',
                  )

views.py

@api_view(['GET'])
def practice_detail(request, pk):
    try: 
        practice = Practice.objects.get(pk=pk) 
    except Practice.DoesNotExist: 
        return JsonResponse({'message': 'The practice does not exist'}, status=status.HTTP_404_NOT_FOUND) 

    if request.method == 'GET': 
        exercises_serializer = PracticeSerializer(practice) 
        return JsonResponse(exercises_serializer.data)

With the code above I get the results of the API view as below using practice id 485 :

/api/practice/485

{
    practice_id: 485,
    score: 10,
    correct: 2,
    wrong: 3,
    not_answered: 0,
}

Now I want to create a custom API view with the result as below :

{
    labels: ["Practice"],
    datasets: [
        {
            label: "Correct",
            data: [2],
        },
        {
            label: "Wrong",
            data: [3],
        },
        {
            label: "Not_answered",
            data: [0],
        }
    ]
}

How to do that?

Is possible to achieve that without create new models?

Upvotes: 0

Views: 980

Answers (1)

Niel Godfrey P. Ponciano
Niel Godfrey P. Ponciano

Reputation: 10709

Define the format in Serializer.to_representation() as documented

.to_representation() - Override this to support serialization, for read operations.

class PracticeSerializer(serializers.ModelSerializer):

    class Meta:
        model = Practice
        fields = ('practice_id',
                  'score',
                  'correct',
                  'wrong',
                  'not_answered',
                  )

    def to_representation(self, instance):
        """
        Object instance -> Dict of primitive datatypes.
        """
        return {
            "labels": ["Practice"],
            "datasets": [
                {
                    "label": "Correct",
                    "data": instance.correct,
                },
                {
                    "label": "Wrong",
                    "data": instance.wrong
                },
                {
                    "label": "Not_answered",
                    "data": instance.not_answered,
                }
            ]
        }

Output:

$ curl http://127.0.0.1:8000/api/practice/485
{"labels": ["Practice"], "datasets": [{"label": "Correct", "data": 2}, {"label": "Wrong", "data": 3}, {"label": "Not_answered", "data": 0}]}

Upvotes: 1

Related Questions