类型数据的对象在Django中不是JSON可序列化错误

问题描述 投票:0回答:1

我有一个注册页面,允许用户注册。这样做之后,我想调用一个API,然后将数据保存到我的模型中(虽然不保存到表单中)。我尝试这样做:

models.py:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE, primary_key=True, related_name = 'profile')
    address = models.TextField()
    birthday = models.DateField()

    def __str__(self):
        return str(self.user)

views.py:

def signup(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST)
        register_form = RegisterForm(request.POST)
        if user_form.is_valid() and register_form.is_valid():
            username = user_form.cleaned_data.get('username'),
            first_name = user_form.cleaned_data.get('first_name'),
            last_name=user_form.cleaned_data.get('last_name'),
            email=user_form.cleaned_data.get('email'),
            password=user_form.cleaned_data.get('password2'),
            birthday = register_form.cleaned_data.get('dob'),
            address=register_form.cleaned_data.get('address'),
            payload = {'username': username,'first_name': first_name,'last_name': last_name,'email':email,'password':password,'register' : {'birthday': birthday,'address': address}}
            response = requests.post('http://127.0.0.1:8000/my_api/',json=payload)
            return redirect("home") #re-direct if login is successful
    else:
        user_form = UserForm()
        register_form = RegisterForm()
    return render(request, 'users/register.html', {'user_form': user_form, 'register_form': register_form})

class RegisterAPI(APIView):
    permission_classes = [AllowAny]
    def post(self, request, format=None):
        serializer = UserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            content = {'status': 'You are registered'}
            return Response(content, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py:

from users.models import Profile
from django.contrib.auth.models import User

class ProfileSerializer(serializers.ModelSerializer):
    birthday = serializers.DateField(format="%Y-%m-%d")
    class Meta:
        model = Profile
        fields = ('birthday','address')

class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer()

    class Meta:
        model = User
        fields = ('username','first_name','last_name','email', 'password', 'profile')

    def create(self, request, validated_data, *args, **kwargs):
        register_data = validated_data.pop('profile')
        password = validated_data.pop('password', None)  
        user = User.objects.create(**validated_data)
        if password is not None:
            user.set_password(password)
        user.save()  
        Profile.objects.create(user = user, **register_data) 
        return validated_data

但是,我收到此错误:

Object of type data is not JSON serializable error in Django

似乎与生日有关。在我的模板上,用户可以将出生日期显示为“ YYYY-MM-DD”。如何解决此错误?

django django-rest-framework
1个回答
0
投票

create中的UserSerializer方法应返回一个User实例而不是validated_data

def create(self, request, validated_data, *args, **kwargs):
   register_data = validated_data.pop('profile')
   password = validated_data.pop('password', None)  
   user = User.objects.create(**validated_data)
   if password is not None:
       user.set_password(password)
   user.save()  
   Profile.objects.create(user = user, **register_data) 
   return user
© www.soinside.com 2019 - 2024. All rights reserved.