Search code examples
djangodjango-rest-framework

Why Django API serializer.data return the data empty?


I have a strange issue with my Django API I created a Model called States My serializer has printed the data well but the serializer.data printing the data like the attached screen

class States(models.Model):
    en_name = models.CharField(max_length=100)
    ar_name = models.CharField(max_length=100)

    class Meta:
        verbose_name_plural = "States"

    def __str__(self):
        return self.en_name

and I created a Serializer file

class StatesSerializer(serializers.Serializer):
    class Meta:
        model = States
        fields = ['en_name', 'ar_name']

then I made my views.py

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def getStates(request):
    states = States.objects.all()  # Fetch all states from the database
    serializer = StatesSerializer(states, many=True)  # Serialize the data
    print(serializer)  # Add this line to check the serialized data
    return Response(serializer.data, status=status.HTTP_200_OK)

my printed serializer

StatesSerializer(<QuerySet [<States: Alexandria>, <States: Aswan>, <States: Asyut>, <States: Beheira>, <States: Beni Suef>, <States: Cairo>, <States: Dakahlia>, <States: Damietta>, <States: Faiyum>, <States: Gharbia>, <States: Giza>, <States: Ismailia>, <States: Kafr El Sheikh>, <States: Luxor>, <States: Matruh>, <States: Minya>, <States: Monufia>, <States: New Valley>, <States: North Sinai>, <States: Port Said>, '...(remaining elements truncated)...']>, many=True):

the attached screen shows how the data is returned

enter image description here


Solution

  • You used a Serializer, so that does not look to Meta, and therefore you defined a serializer with no fields. Use a ModelSerializer instead:

    #                      ModelSerializer 🖟
    class StatesSerializer(serializers.ModelSerializer):
        class Meta:
            model = States
            fields = ['en_name', 'ar_name']