Reputation: 41
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.
class CustomUser(AbstractUser):
role = models.CharField(blank=True, max_length=120)
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)
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}}
{
"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
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
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