,python,django,object"/>

首页 > 解决方案 > Django TypeError Field 'id' 需要一个数字,但得到了

问题描述

错误:TypeError: Field 'id' expected a number but got <class 'account.models.User'>.

我一直在阅读身份验证文档,并且一直收到该错误。我已经尝试了一些不同的排列,但我真的不确定出了什么问题,除了它显然是一个类型错误。

最终目标是只返回新创建用户的“id”和“email”以及令牌,由于这个错误,我还无法测试返回的令牌,但我想应该是好的。

正在工作的是它成功地将一个新用户发布到数据库中,并在另一个表中使用一个具有匹配键的令牌,现在我有大约 50 个用户来自测试和搞乱。

旁注我已经覆盖了默认的用户 Django 设置你,但我遵循了文档,所以代码应该是可靠的,但如果需要我显然可以发布它

视图.py

from rest_framework import status
from .models import User
from .serializers import UserSerializer, RegisterSerializer
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework.authtoken.models import Token



@api_view(['POST',])
def RegisterAPI(request):
    if request.method == 'POST':
        serializer = RegisterSerializer(data = request.data)
    if serializer.is_valid(raise_exception=True):
        user = serializer.save()
        content = {
            'user': {'id': user.pk, 'email': user.email},
            'auth': Token.objects.get(user = User).key 
        }
        # Return the reponse
        return Response(content)`

序列化程序.py

from rest_framework import serializers
from django.contrib.auth import get_user_model
from django.contrib.auth import authenticate
from .models import User

# Register Serializer
class RegisterSerializer(serializers.ModelSerializer):
    class Meta: 
        model = User
        fields = ('id', 'email', 'password')
        extra_kwargs = {'password':{'write_only': True}}

    def save(self):
        user = User(
            email = self.validated_data['email'],
        )
        password = self.validated_data['password']

        user.set_password(password)
        user.save()
        return user

# User Serializer
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('email')

文档

对我没有帮助的类似文章

标签: pythondjangoobject

解决方案


您正在将User模型类传递给.get(...)方法,但它应该是刚刚从序列化程序获得的User模型实例。

@api_view(['POST', ])
def register_api(request):
    if request.method == 'POST':
        serializer = RegisterSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        content = {
            'user': {'id': user.pk, 'email': user.email},
            'auth': Token.objects.get(user=user).key
        }
        # Return the reponse
        return Response(content)

推荐阅读