django - 当我通过我的 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的世界里,任何人都可以帮助我。
解决方案
您不必手动更新 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)
推荐阅读
- php - 如何将 WP_Query 中的帖子分成 2 列
- python - 根据 pandas.DataFrame 中的值更改 seaborn.catplot 标记颜色亮度
- python - 在python中切片具有相似开始和结束字符串的文本文件的一部分
- google-cloud-platform - 在云上工作时,当 curl 或 wget 不是一种选择时,如何下载文件?
- python-3.x - 如何在python中以列表的形式获取最近20天的日期?
- php - Mac完全卸载未从brew安装的php
- javascript - html元素消失后Javascript代码更改
- r - R创建具有未来日期的测试数据框
- python-3.x - 将数据写入数据库的最快方法
- google-play-console - 无法验证 Google 开发者帐户的 ID