简体   繁体   English

在 Django 中创建新用户返回:“用户类型的对象不是 JSON 可序列化的”

[英]Creating a new user in Django returns: “Object of type Users is not JSON serializable”

I am trying to create a new user in Django and get the error:我正在尝试在 Django 中创建一个新用户并收到错误消息:

Object of type Users is not JSON serializable用户类型的 Object 不是 JSON 可序列化的

The error seems quite self explainatory - but I just cannot even get a print of the suspected vars to make sure this is what causing all the trouble.该错误似乎很容易解释-但我什至无法打印可疑变量,以确保这是造成所有麻烦的原因。

I have been working django for a while and noticed that i just do not know to find where is the error exactly (not only in this case).我一直在工作 django 一段时间,并注意到我只是不知道确切地找到错误在哪里(不仅在这种情况下)。 So as a bonus if anyone can walk me through the stages of debugging this - this might save me tons of questions on the future.因此,如果有人可以引导我完成调试阶段,那么作为奖励 - 这可能会为我节省大量关于未来的问题。

[13/Feb/2021 20:31:55] "POST /api/register/ HTTP/1.1" 400 62
Internal Server Error: /api/register/
Traceback (most recent call last):
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/rest_framework/decorators.py", line 50, in handler
    return func(*args, **kwargs)
  File "/Users/mypc/Library/Mobile Documents/com~apple~CloudDocs/SN/SocialNetwork/django/api/api_views/register.py", line 15, in Register
    serializer.save()
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/rest_framework/serializers.py", line 205, in save
    self.instance = self.create(validated_data)
  File "/Users/mypc/Library/Mobile Documents/com~apple~CloudDocs/SN/SocialNetwork/django/users/serializers.py", line 31, in create
    print(type(JsonResponse(user, safe=False)))
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/django/http/response.py", line 567, in __init__
    data = json.dumps(data, cls=encoder, **json_dumps_params)
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/json/__init__.py", line 234, in dumps
    return cls(
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/site-packages/django/core/serializers/json.py", line 105, in default
    return super().default(o)
  File "/Users/mypc/.pyenv/versions/anaconda3-2020.07/envs/SN/lib/python3.9/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type Users is not JSON serializable

view:看法:

from rest_framework import status, permissions
from rest_framework.decorators import api_view, permission_classes
from rest_framework.response import Response
from users import serializers

@api_view(['POST'])
@permission_classes((permissions.AllowAny,))
def Register(request): 
    if request.method == 'POST':
        serializer = serializers.RegisterFormSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

form:形式:

from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django import forms
from users.models import Users

class RegisterForm(UserCreationForm):

    email = forms.EmailField()

    class Meta:
        model = Users
        fields = ["password1", "username", "password2", "email"]

serializer:序列化器:

from django import forms
from .forms import RegisterForm
from django.core.exceptions import ValidationError
from drf_braces.serializers.form_serializer import FormSerializer
from users.models import Users
from django.http import JsonResponse
from django.forms.models import model_to_dict


class RegisterFormSerializer(FormSerializer):
    
    class Meta(object):
        form = RegisterForm
        fields = ['password1', 'username', 'password2', 'email']

    # def create(self, validated_data):
    # # print(validated_data)
    # # return RegisterForm(**validated_data)
    #     return Users.objects.create(**validated_data)

    def create(self, validated_data):
        password1 = validated_data.pop('password1', '')
        password2 = validated_data.pop('password2', '')

        if password1 and password2 and password1 != password2:
            raise ValidationError('password mismatch')

        user = Users.objects.create(**validated_data)
        user.set_password(password1)
        user.save()
        print(type(JsonResponse(user, safe=False)))
        print(user, safe=False)
        return JsonResponse(user, safe=False)
        # return JsonResponse(model_to_dict(user))

users model:用户 model:

from django.db import models
from django.contrib.auth.models import AbstractUser


# https://rahmanfadhil.com/django-login-with-email/
class Users(AbstractUser): 

    USERNAME_FIELD = 'email'
    email = models.EmailField(unique=True)
    REQUIRED_FIELDS = ['username'] # removes email from REQUIRED_FIELDS

    def __str__(self):
        # return (self.email, self.username)
        template = '{0.email} {0.username}'
        return template.format(self)

@W.Doch- You are trying to return a User object in your Json response. @W.Doch-您试图在 Json 响应中返回用户 object。 That is why it is showing can't serialize.这就是为什么它显示无法序列化。

return JsonResponse(user, safe=False)


# return JsonResponse(model_to_dict(user)) - The right approach. 

How about you add a model method something like this?您如何添加类似这样的 model 方法?

 def as_dict(self):
        return {
            "name": self.name,
            "description": self.description,
           ........
}
 and then do return JsonResponse(user.as_dict(),safe=False)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM