【问题标题】:mapping request.data into a onetoone field将 request.data 映射到 onetoone 字段
【发布时间】:2021-05-12 05:11:06
【问题描述】:

我有一个如下 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",
    "first_name":"name1",
    "email":"name1@gmail.com"
    },
    "phone": "123456",
    "app_id": "435673339303abc"
}

【问题讨论】:

    标签: python-3.x django django-models django-rest-framework one-to-one


    【解决方案1】:

    您可以在视图中从 CustomUserModel 获取行。 CustomUserModel.objects.get(user=request.user.user_id)

    【讨论】:

    • 您能详细说明一下吗?我想 Django 内置用户模型没有 user_id 字段!
    • 必须有一个用户模型和user_id,我的意思是用户模型中的主键
    • 我以这种方式修改了视图代码:def post(self, request, format=None): serializer = CustomUserModel.objects.get(user=request.user.user_id) 这是抛出错误:'AnonymousUser' object has no attribute 'user_id' 我通过在控制台中打印 request.POST 进行了检查。它给了我<QueryDict: {}>
    • 现在只需从 User 模型中获取所有对象,看看主键或唯一键是什么。使用 .all() 获取所有行。
    • 对不起,我对 django 的了解很少。默认情况下,id 将是 User 模型的主键字段,对吧?你能描述完整的代码以便我理解吗?
    【解决方案2】:

    经过多次迭代,我找到了一种方法,将请求数据映射到字典中。 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-10
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2018-07-29
      相关资源
      最近更新 更多