首页 > 解决方案 > 当我通过我的 api 发送数据时,我在 /api/add/ 处收到此错误 TypeError UserInfo 类型的对象不是 JSON 可序列化的

问题描述

我有两个模型,一个用于User另一个是UserInfo,我将用户的附加信息插入到与用户模型具有外键关系的模型中。

当我向 api 添加附加信息时,数据被存储但我得到错误而不是响应。

序列化程序.py

class UserCreateSerializerCustom(UserCreateSerializer):
    
    class Meta(UserCreateSerializer.Meta,):
        model = User
        fields = (
            'id',
            'email',
            'username',
            'password',
            'first_name',
            'last_name',
            'phone',         
        )

## User Additional Info Serializers
class UserAdditionalSerializers(serializers.ModelSerializer):
    user = UserCreateSerializerCustom()
    class Meta:
        model = UserInfo
        fields = (
            'user',
            'address',
            'zipcode',
        )
    

视图.py

class UserAdditionalView(generics.ListCreateAPIView):   
    queryset = UserInfo.objects.all()
    serializer_class = UserAdditionalSerializers
    # authentication_classes = (TokenAuthentication)
    def post(self,request,*args,**kwargs):
       
        token = request.META['HTTP_AUTHORIZATION'].split(" ")[1]
        print(token)
        us = Token.objects.get(key=token).user

        user1 = User.objects.get(email=us)

        user,_ = UserInfo.objects.get_or_create(user=user1)
        user.address=request.POST['address']
        user.zipcode=request.POST['zipcode']
        user.save()
        return Response({'user':user})

网址.py

path('add/',views.UserAdditionalView.as_view()),

模型.py

class User(AbstractUser):
    # username = None
    email = models.EmailField(verbose_name='email',max_length=50,unique=True)
    #phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$')
    #phone = PhoneNumberField(unique=True,blank=False,null=False)
    phone =  models.CharField(max_length=17,blank=True)

    REQUIRED_FIELDS = [
        'first_name',
        'last_name',
        'phone',
        'username',
    ]

    USERNAME_FIELD = 'email'

    def get_username(self):
        return self.email
class UserInfo(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    address = models.CharField(max_length=50)
    zipcode = models.CharField(max_length=20)

    def __str__(self):
        return str(self.user)

我的预期反应是

 {
    "user": {
        "id": 3,
        "email": "test@test.com",
        "username": "test",
        "first_name": "test",
        "last_name": "test",
        "phone": "+1(123)-456-7890"
    },
    "address": "kjbnjklqnja",
    "zipcode": "69996"
}

为了获得所需的响应,我应该怎么做..?

我正在根据请求发送的令牌查找用户。我刚开始在rest api的世界里,任何人都可以帮助我。

标签: djangoserializationdjango-rest-framework

解决方案


您不必手动更新 post 方法中的对象,因为序列化程序会处理它,并且在发送数据之前,Response您必须序列化数据

所以

from rest_framework import status

class UserAdditionalView(generics.ListCreateAPIView):   
    queryset = UserInfo.objects.all()
    serializer_class = UserAdditionalSerializers
    # authentication_classes = (TokenAuthentication)

    def post(self,request,*args,**kwargs):
       
        token = request.META['HTTP_AUTHORIZATION'].split(" ")[1]
        us = Token.objects.get(key=token).user
        user1 = User.objects.get(email=us)
        user,_ = UserInfo.objects.get_or_create(user=user1)
        serializer = UserAdditionalSerializers(data=request.data,instance=user)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data,status=status.HTTP_201_OK)
        else:
            return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

推荐阅读