Django serializer чтение и запись нескольких полей модели с помощью

Как читать и писать несколько моделей в Django rest framework Model Serializer. например, я создал модель user-create view set API, для этого я создаю Model Serializer. там мне нужно дать несколько разрешений. для этого я передаю поле user_permissions с массивом id разрешений. теперь, как я могу определить поле в user Model Serializer, которое может создать пользователя с этим разрешением и затем получить данные пользователя с разрешением?

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = AbstractUser
        fields = "__all__"
        extra_kwargs = {'password': {'write_only': True},}
        extra_fields = ['user_permissions']

#view
class RegistrationView(viewsets.ModelViewSet):
    serializer_class = UserSerializer
    queryset = AbstractUser.objects.all()
    parser_classes = (FormParser, MultiPartParser)
    permission_classes_by_action = [IsAdminUser, ]

    def create(self, request, *args, **kwargs):
        response_data = super(RegistrationView, self).create(request,*args,**kwargs)
        return Response({"data": response_data.data})

тело запроса

  {
   "username": "testuser",
   "email": "testuser@example.com",
   "first_name": "test",
   "last_name": "test",
   "password": "Abcd@123456",
   "user_permissions": [1, 2, 3, 4, 5]
  }

требуемый ответ

{
"id": 1,
"email": "testuser@example.com",
"username": "testuser",
"first_name": "test",
"last_name": "test",
"is_superuser": false,
"is_staff": false,
"is_active": true,
"date_joined": "2022-08-17T10:25:48.446821Z",
"user_permissions": [
    {
            "id": 1,
            "name": "Can add User",
            "codename": "add_user",
            "content_type": "account"
        },
        {
            "id": 2,
            "name": "Can change User",
            "codename": "change_user",
            "content_type": "account"
        },
        {
            "id": 3,
            "name": "Can delete User",
            "codename": "delete_user",
            "content_type": "account"
        },
        {
            "id": 4,
            "name": "Can view User",
            "codename": "view_user",
            "content_type": "account"
        },
        {
            "id": 5,
            "name": "Can view log entry",
            "codename": "view_logentry",
            "content_type": "admin"
        }
],
"groups": []
}

теперь, как я могу определить поле в сериализаторе модели пользователя, которое может создать пользователя с этим разрешением, а затем получить данные пользователя с разрешением?

Вы можете переопределить метод create()

def create(self, validated_data):
    instance = super().create(validated_data) #save instance first
    for permission_id in validated_data['user_permissions']:
        ... #do something for associate user_permission to user
    return instance
        

У меня есть некоторые сомнения по поводу extra_fields = ['user_permissions'].
Я думаю, вам нужно добавить ListField в сериализатор с именем user_permissions, таким образом сериализатор распознает поле, проверит его и вы сможете найти поле в словаре validated_data.

Вернуться на верх