Python 3.x 将request.data映射到onetoone字段

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",

我有一个JSON请求数据,如下所示,我希望使用Django序列化程序和视图处理该数据,以便使用POST请求在数据库中创建记录

{
    "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的主键字段?你能描述完整的代码让我容易理解吗?