Возврат пользователя со списком групп, к которым он принадлежит в Django Rest API - PullRequest
0 голосов
/ 05 мая 2020

Я пишу API и хочу вернуть список пользователей вместе с группами, к которым принадлежит каждый пользователь. Я новичок в Django и застрял. Я пробовал несколько способов, но ближе всего к решению я подошел, когда Django возвращал auth.Group.none, когда пользователь находится в группе.

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 Вывод

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

Любой ввод приветствуется! Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Ответ Захры Эбрахими правильный. Это просто продолжение ответа. если вы хотите использовать просматриваемую форму api drf для создания экземпляра, добавьте queryset из groups для удобства.

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}}
0 голосов
/ 05 мая 2020
groups = serializers.CharField() 

, в вашем сериализаторе неверно измените сериализатор на это:

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}}
...