如何解决将 request.data 映射到 onetoone 字段
我有一个 JSON 请求数据,如下所示,我想使用 Django 序列化程序和视图来处理它,以便使用 POST 请求在数据库中创建记录。
{
"username":"user1","first_name":"name1","email":"name1@gmail.com","phone": "123456","app_id": "435673339303abc"
}
以下是我的 Django 数据库模型和序列化程序,其中创建了一个具有 onetoone django 用户模型的自定义用户模型:
models.py
from django.contrib.auth.models import User
from django.db import models
class CustomUserModel(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
phone = models.CharField(max_length=20,blank=True)
app_id = models.CharField(max_length=20,blank=True)
serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username','first_name','email')
class CustomUserSerializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
class Meta:
model = CustomUserModel
fields = ('user','phone','app_id')
def create(self,validated_data):
user_data = validated_data.pop('user')
user = UserSerializer.create(UserSerializer(),validated_data=user_data)
customuser,created = CustomUserModel.objects.update_or_create(user=user,defaults={
'phone': validated_data.pop('phone'),'app_id': validated_data.pop('app_id')})
return customuser
views.py
class usersApi(generics.ListAPIView):
serializer_class = CustomUserSerializer
def get_queryset(self):
queryset = CustomUserModel.objects.all()
return queryset
def post(self,request,format=None):
serializer = CustomUserSerializer(data=request.data)
if serializer.is_valid(raise_exception=ValueError):
serializer.create(validated_data=request.data)
return Response(serializer.data,status=status.HTTP_201_CREATED)
return Response(serializer.error_messages,status=status.HTTP_400_BAD_REQUEST)
但是使用这个序列化器和视图,我必须将嵌套的 json 数据传递给我不想要的用户对象,如下所示。
{
"user":
{
"username":"user1","email":"name1@gmail.com"
},"app_id": "435673339303abc"
}
解决方法
您可以从视图中的 CustomUserModel 获取行。 CustomUserModel.objects.get(user=request.user.user_id)
,经过多次迭代,我找到了一种方法,将请求数据映射到字典中。 views.py
class usersApi(generics.ListAPIView):
serializer_class = CustomUserSerializer
def get_queryset(self):
queryset = CustomUserModel.objects.all()
return queryset
def post(self,request,format=None):
username = request.data['username']
first_name = request.data['first_name']
email = request.data['email']
phone = request.data['phone']
app_id = request.data['app_id']
user_data = {'user': {'username': username,'first_name': first_name,'email': email},'phone': phone,'app_id': app_id}
serializer = CustomUserSerializer(data=user_data)
if serializer.is_valid(raise_exception=ValueError):
serializer.create(validated_data=user_data)
return Response(serializer.data,status=status.HTTP_201_CREATED)
return Response(serializer.error_messages,status=status.HTTP_400_BAD_REQUEST)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。