GhettoThief
GhettoThief

Reputation: 41

Returning a user with a list of the groups he belongs to in Django Rest API

I'm writing an API and I want to return a list of users along with the groups each user belongs to. I'm fairly new to Django and I'm stuck. I've tried several ways but the closest I came to finding a solution is when Django returned auth.Group.none while the user is in a Group.

authentication/models.py

   class CustomUser(AbstractUser):
       role = models.CharField(blank=True, max_length=120)

authentication/views.py

   class CustomUserView(APIView):
    permission_classes = [IsAuthenticated, IsAdmin, ]
    serializer_class = CustomUserSerializer

    def get(self, request, format='json'):
        queryset = CustomUser.objects.all()
        serializer = CustomUserSerializer(queryset, many=True)
        filterset_fields = ['id', 'name', 'email', 'groups']
        return Response(serializer.data, status=status.HTTP_200_OK)

authentication/serializers.py

   class CustomUserSerializer(serializers.ModelSerializer):
    email = serializers.CharField(
        required=True
    )
    username = serializers.CharField(required=True)
    password = serializers.CharField(min_length=8, write_only=True)
    first_name = serializers.CharField()
    last_name = serializers.CharField()
    groups = serializers.CharField()
    role = serializers.CharField()

    class Meta:
        model = CustomUser
        fields = ('id', 'email', 'username', 'first_name', 'last_name', 'password', 'groups', 'role')
        extra_kwargs = {'password': {'write_only': True}}

JSON Output

    {
        "id": 4,
        "email": "",
        "username": "testuser",
        "first_name": "",
        "last_name": "",
        "groups": "auth.Group.None"
    }

Any input would be appreciated! Thanks in advance.

Upvotes: 1

Views: 1524

Answers (2)

Md. Tanvir Raihan
Md. Tanvir Raihan

Reputation: 4285

Zahra Ebrahimi's answer is correct, Its just an extension of the answer. if you want to use drf's browsable api form to create the instance, then add a queryset of groups, for the conveniences.

class GroupSerializer(PrimaryKeyRelatedField,serializers.ModelSerializer):
    class Meta:
        model= Group
        fields = ('id','name')

class CustomUserSerializer(serializers.ModelSerializer):
    ......
    ......
    groups = GroupSerializer(many=True, queryset=Groups.objects.all())
    ......

    class Meta:
        model = CustomUser
        fields = ('id', 'email', 'username', 'first_name', 'last_name', 'password','groups', 'role')
        extra_kwargs = {'password': {'write_only': True}}

Upvotes: 0

Zahra Ebrahimi
Zahra Ebrahimi

Reputation: 71

groups = serializers.CharField() 

, in your serializer is incorrect , change serializer to this:

from django.contrib.auth.models import Group

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model= Group
        fields = ('id','name')

class CustomUserSerializer(serializers.ModelSerializer):
    email = serializers.CharField(required=True)
    username = serializers.CharField(required=True)
    password = serializers.CharField(min_length=8, write_only=True)
    first_name = serializers.CharField()
    last_name = serializers.CharField()
    groups = GroupSerializer(many=True)
    role = serializers.CharField()

    class Meta:
        model = CustomUser
        fields = ('id', 'email', 'username', 'first_name', 'last_name', 'password','groups', 'role')
        extra_kwargs = {'password': {'write_only': True}}

Upvotes: 2

Related Questions