【问题标题】:Django serializer read and write multiple model field withDjango序列化器读取和写入多个模型字段
【发布时间】:2022-08-23 22:37:52
【问题描述】:

如何在 Django rest 框架 Model Serializer 中读写多个模型。就像我创建了一个用户创建模型视图集 API,为此,我创建了一个模型序列化器。那里我需要授予多个权限。为此,我将 user_permissions 字段与权限 ID 数组一起传递。现在,如何在用户模型序列化器中定义一个字段,可以创建具有此权限的用户,然后获取具有权限的用户的数据?

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\": []
}

    标签: django django-models django-rest-framework django-serializer


    【解决方案1】:

    现在,如何在用户模型序列化程序中定义一个字段,可以创建具有此权限的用户,然后获取具有权限数据的用户?

    您可以覆盖序列化程序类中的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用户权限,通过这种方式,序列化程序识别该字段,对其进行验证,您可以在 valid_data 字典中找到该字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 2018-06-08
      • 2020-11-23
      • 2018-06-07
      • 1970-01-01
      • 2016-11-14
      相关资源
      最近更新 更多