DRF response list field

2.4k Views Asked by At

How can I get response in an array format in Django drf? I am new in python-drf programming. kindly help with solutions.

I just want the team_users in an array format, but now it is returning in an array with each letter seperated by quotes.

{
    "id": 3,
    "team_name": "team 3",
    "team_icon": "/media/icon/underground_3Dz5sfD.png",
    "team_users": [
        "[",
        "'",
        "s",
        "k",
        "a",
        "r",
        "a",
        "n",
        "7",
        "1",
        "4",
        "@",
        "g",
        "m",
        "a",
        "i",
        "l",
        ".",
        "c",
        "o",
        "m",
        "'",
        ",",
        " ",
        "'",
        "s",
        "a",
        "m",
        "p",
        "l",
        "e",
        "1",
        "2",
        "3",
        "@",
        "g",
        "m",
        "a",
        "i",
        "l",
        ".",
        "c",
        "o",
        "m",
        "'",
        "]"
    ]
}, 

required format is :

    "id": 3,
    "team_name": "team 3",
    "team_icon": "/media/icon/underground_3Dz5sfD.png",
    "team_users": ["first_email", "second_email"]

This is the code in serializers.py

class TeamSerializer(serializers.ModelSerializer):
        team_users = serializers.ListField(child=serializers.EmailField(min_length=0, max_length=100))


        class Meta():
            model=Team
            fields = ('id','team_name', 'team_icon', 'team_users')

models.py

class Team(models.Model):
    team_name = models.CharField(max_length=255)
    team_icon = models.ImageField()
    team_users = models.EmailField()

In views.py

class GetTeam(APIView):


    def get(self, request, *args, **kwargs):
        data_list = []
        teams = models.Team.objects.all()
        for team in teams:
            data_list.append(serializers.TeamSerializer(team).data)
        return Response(data_list)
2

There are 2 best solutions below

4
On

One of the possible solution is to use 'SerializerMethodField'

class TeamSerializer(serializers.ModelSerializer):

    team_users = serializers.SerializerMethodField(read_only=True)

    def get_team_users(self, obj):
        return [x.email for x in obj.team_users]

Also depends on your team user model, but you can tailor this to your needs.

0
On
class GetTeam(APIView):

    def get(self, request, *args, **kwargs):
        teams = models.Team.objects.all()
        return Response(serializers.TeamSerializer(team, many=True).data)

If the field is used to represent a to-many relationship, you should add the many=True flag to the serializer field.