Python 3.x 将request.data映射到onetoone字段
我有一个JSON请求数据,如下所示,我希望使用Django序列化程序和视图处理该数据,以便使用POST请求在数据库中创建记录Python 3.x 将request.data映射到onetoone字段,python-3.x,django,django-models,django-rest-framework,one-to-one,Python 3.x,Django,Django Models,Django Rest Framework,One To One,我有一个JSON请求数据,如下所示,我希望使用Django序列化程序和视图处理该数据,以便使用POST请求在数据库中创建记录 { "username":"user1", "first_name":"name1", "email":"name1@gmail.com", "phone": "123456",
{
"username":"user1",
"first_name":"name1",
"email":"name1@gmail.com",
"phone": "123456",
"app_id": "435673339303abc"
}
下面是我的Django数据库模型和序列化程序,其中创建了一个自定义用户模型,该模型具有onetoone Django用户模型:
型号.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)
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
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)
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)
序列化程序.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)
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
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)
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)
视图.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)
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
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)
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)
但是有了这个序列化程序和视图,我必须用用户对象传递一个嵌套的json数据,如下所示,我不想这样做
{
"user":
{
"username":"user1",
"first_name":"name1",
"email":"name1@gmail.com"
},
"phone": "123456",
"app_id": "435673339303abc"
}
您可以从视图中的CustomUserModel获取行。
CustomUserModel.objects.get(user=request.user.user\id)经过多次迭代,我找到了一种方法,将请求数据映射到字典中。 视图.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)
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
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)
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)
你能详细说明一下吗?我想Django内置用户模型没有用户id字段!必须有一个用户模型,通过用户id,我指的是用户模型中的主键i修改的视图代码是这样的:
def post(self,request,format=None):serializer=CustomUserModel.objects.get(User=request.User.User\id)
这是一个抛出错误:“匿名用户”对象没有属性“用户id”
我通过在控制台中打印request.POST进行了检查。它给了我
现在只需从用户模型中获取所有对象,然后查看主键或唯一键是什么。使用.all()获取所有行。对不起,我对django知之甚少。默认情况下,id
将是User
model right的主键字段?你能描述完整的代码让我容易理解吗?