Python API端点返回TypeError:';类型';对象是不可编辑的

Python API端点返回TypeError:';类型';对象是不可编辑的,python,django,Python,Django,我正在编写一个createuserapi,通过使用AbstractBaseUser类扩展类users。对于常规的模型字段,比如EmailField,CharField,BooleanField,API运行良好。但后来我决定也存储用户的profile\u图片。因此,我创建了一个新字段profile\u picture作为ImageField,将用户的配置文件图片的路径存储在相同的扩展users模型中 型号.py class Users(AbstractBaseUser, PermissionsMi

我正在编写一个createuserapi,通过使用
AbstractBaseUser
类扩展类
users
。对于常规的
模型字段
,比如
EmailField
CharField
BooleanField
,API运行良好。但后来我决定也存储用户的
profile\u图片。因此,我创建了一个新字段
profile\u picture
作为
ImageField
,将用户的配置文件图片的路径存储在相同的扩展
users
模型中

型号.py

class Users(AbstractBaseUser, PermissionsMixin):

    """
    This model is used to store user login credential and profile information.
    It's a custome user model but used for Django's default authentication.
    """

    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255, blank=False, null=False)
    last_name = models.CharField(max_length=255, blank=False, null=False)
    profile_picture = models.ImageField(upload_to='Images/', max_length=None, blank=True)
    is_active = models.BooleanField(default=True)

    # defing a custome user manager class for the custome user model.
    objects = managers.UserManager()

    # using email a unique identity for the user and it will also allow user to use email while logging in.
    USERNAME_FIELD = 'email'
from django.shortcuts import render
from . import views
from rest_framework.views import APIView
from django.db import IntegrityError
from rest_framework import status
from . import models, serializers
from rest_framework.response import Response
from django.core.mail import send_mail
from rest_framework.parsers import FileUploadParser



class UserAPIViews(APIView):
    """
    """

    parser_classes = (FileUploadParser)

    def post(self, request, format=None):
        """
        """
        print(request.data)
        serialized_data = serializers.UserSerializer(data=request.data)
        if serialized_data.is_valid():

            try:
                user_id = serialized_data.save()
            except IntegrityError as error:
                message = f"Email already exist."
                return Response ({
                    'error_message' : message,
                    'status' : status.HTTP_226_IM_USED
                })

            subject = 'Eitan - Case Manager Account Credentials'
            body = f"Hi {serialized_data.validated_data.get('first_name')} Your case manager account is ready. Please use following credentials to login. Email - {serialized_data.validated_data.get('email')}, Password - {serialized_data.validated_data.get('password')} Thank You! Team Eitan."
            sender = "steinnlabs@gmail.com"
            to = serialized_data.validated_data.get('email')

            send_mail(subject, body, sender, [to], fail_silently=False)

            success_message = f"User has been created."

            return Response({
                'success_message' : success_message,
                'status' : status.HTTP_201_CREATED
            })

        else:
            return Response (serialized_data.error_messages)
# Image upload configurations
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = '/media/
然后我更新了
UserAPIView
class以添加
parser\u classes=(FileUploadParser)

view.py

class Users(AbstractBaseUser, PermissionsMixin):

    """
    This model is used to store user login credential and profile information.
    It's a custome user model but used for Django's default authentication.
    """

    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255, blank=False, null=False)
    last_name = models.CharField(max_length=255, blank=False, null=False)
    profile_picture = models.ImageField(upload_to='Images/', max_length=None, blank=True)
    is_active = models.BooleanField(default=True)

    # defing a custome user manager class for the custome user model.
    objects = managers.UserManager()

    # using email a unique identity for the user and it will also allow user to use email while logging in.
    USERNAME_FIELD = 'email'
from django.shortcuts import render
from . import views
from rest_framework.views import APIView
from django.db import IntegrityError
from rest_framework import status
from . import models, serializers
from rest_framework.response import Response
from django.core.mail import send_mail
from rest_framework.parsers import FileUploadParser



class UserAPIViews(APIView):
    """
    """

    parser_classes = (FileUploadParser)

    def post(self, request, format=None):
        """
        """
        print(request.data)
        serialized_data = serializers.UserSerializer(data=request.data)
        if serialized_data.is_valid():

            try:
                user_id = serialized_data.save()
            except IntegrityError as error:
                message = f"Email already exist."
                return Response ({
                    'error_message' : message,
                    'status' : status.HTTP_226_IM_USED
                })

            subject = 'Eitan - Case Manager Account Credentials'
            body = f"Hi {serialized_data.validated_data.get('first_name')} Your case manager account is ready. Please use following credentials to login. Email - {serialized_data.validated_data.get('email')}, Password - {serialized_data.validated_data.get('password')} Thank You! Team Eitan."
            sender = "steinnlabs@gmail.com"
            to = serialized_data.validated_data.get('email')

            send_mail(subject, body, sender, [to], fail_silently=False)

            success_message = f"User has been created."

            return Response({
                'success_message' : success_message,
                'status' : status.HTTP_201_CREATED
            })

        else:
            return Response (serialized_data.error_messages)
# Image upload configurations
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = '/media/
更新了
settings.py
以添加
MEDIA\u ROOT
MEDIA\u URL

设置.py

class Users(AbstractBaseUser, PermissionsMixin):

    """
    This model is used to store user login credential and profile information.
    It's a custome user model but used for Django's default authentication.
    """

    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255, blank=False, null=False)
    last_name = models.CharField(max_length=255, blank=False, null=False)
    profile_picture = models.ImageField(upload_to='Images/', max_length=None, blank=True)
    is_active = models.BooleanField(default=True)

    # defing a custome user manager class for the custome user model.
    objects = managers.UserManager()

    # using email a unique identity for the user and it will also allow user to use email while logging in.
    USERNAME_FIELD = 'email'
from django.shortcuts import render
from . import views
from rest_framework.views import APIView
from django.db import IntegrityError
from rest_framework import status
from . import models, serializers
from rest_framework.response import Response
from django.core.mail import send_mail
from rest_framework.parsers import FileUploadParser



class UserAPIViews(APIView):
    """
    """

    parser_classes = (FileUploadParser)

    def post(self, request, format=None):
        """
        """
        print(request.data)
        serialized_data = serializers.UserSerializer(data=request.data)
        if serialized_data.is_valid():

            try:
                user_id = serialized_data.save()
            except IntegrityError as error:
                message = f"Email already exist."
                return Response ({
                    'error_message' : message,
                    'status' : status.HTTP_226_IM_USED
                })

            subject = 'Eitan - Case Manager Account Credentials'
            body = f"Hi {serialized_data.validated_data.get('first_name')} Your case manager account is ready. Please use following credentials to login. Email - {serialized_data.validated_data.get('email')}, Password - {serialized_data.validated_data.get('password')} Thank You! Team Eitan."
            sender = "steinnlabs@gmail.com"
            to = serialized_data.validated_data.get('email')

            send_mail(subject, body, sender, [to], fail_silently=False)

            success_message = f"User has been created."

            return Response({
                'success_message' : success_message,
                'status' : status.HTTP_201_CREATED
            })

        else:
            return Response (serialized_data.error_messages)
# Image upload configurations
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
MEDIA_URL = '/media/
现在,当我尝试在
http://127.0.0.1:8000/user/create/
它返回-

TypeError at /user/create/
'type' object is not iterable
parser\u classes=(FileUploadParser)
应该是

parser\u classes=(FileUploadParser,)
或者使用list
[]
而不是tuple


如果不添加逗号,Python将以与
x=something
相同的方式解释
x=(something)

我只需要添加解析器类来解析
请求。数据

parser_classes = (FormParser, MultiPartParser)

现在它返回
{“detail”:“缺少文件名。请求应该包含一个带有文件名参数的内容处置头。”}
这是另一个错误。你问的那个问题已经解决了!请检查您能告诉我如何将请求传递到URL
http://127.0.0.1:8000/user/create/
。我以前从未创建过图像上传API。我不知道如何发送JSON请求来上传文件。我是否必须提到图像文件的路径作为我的JSON对象中键
profile\u picture`的值?您可以使用表单通过
request.FILES
获取内容。见: