[英]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.