【问题标题】:Serializer is not valid序列化程序无效
【发布时间】:2020-03-23 13:34:15
【问题描述】:

当我尝试向我的 API 端点发出 POST 请求以在我的用户表中创建一个用户时,我收到了神秘的序列化程序错误。该错误表明需要emailpasswordcodename(创建用户需要 3 个字符串)。但我正在发送所有三个字符串。这是因为序列化程序无效(转到serializers.pyif serializer.is_valid() 检查)...但我不知道为什么它无效。

整个说的错误信息:

{'codename': [ErrorDetail(string=u'This field is required.', code=u'required')], 'password': [ErrorDetail(string=u'This field is required.', code=u'required')], 'email': [ErrorDetail(string=u'This field is required.', code=u'required')]}

所有这些文件都在我的 Django 目录中的 users 文件夹中。

serializers.py:

from rest_framework import serializers
from .models import User

class UserPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = User 
        fields = ('email', 'password', 'codename')

views.py:

from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status

from .serializers import *
from .models import User
from argon2 import PasswordHasher
import json

@api_view(['POST'])
def create_user(request):
    print("inside create_user")
    """ POST = Create user. """
    data = {}
    # print("request.data:\n", request.data)
    serializer = UserPostSerializer(data=request.data)
    print("got serializer")
    if serializer.is_valid():
        print("serializer is valid!")
        email = serializer.data['email']
        codename = serializer.data['codename']
        password = serializer.data['password']

        user = User.objects.filter(email=email)

        if not user:
            # Apply Argon2
            ph = PasswordHasher()
            hash = ph.hash(password)

            # Create user
            new_user = User(email=email, password=hash, codename=codename)
            new_user.save()

            request.session['email'] = email
            request.session['id'] = new_user.pk
            print(request.session['email'], "has logged in!")
            print(request.session['id'], "user's id")
            return Response(serializer.data, status=status.HTTP_200_OK)

        # User with this email found... Please login...
        else:
            return Response(status=status.HTTP_409_CONFLICT)

    else:
        print(serializer.errors)
        return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)

models.py:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models

# Create your models here.
class User(models.Model):
    email = models.CharField(max_length=255, blank=False)
    codename = models.CharField(max_length=255, blank=False)
    password = models.CharField(max_length=255, blank=False)
    profilePic = models.ImageField(upload_to='images/', blank=True)

【问题讨论】:

  • 如何发送 POST 请求?
  • 我使用 Postman,我发送一个 JSON 字典。例如:{'email':'fake@gmail.com', 'password':'password', 'codename':'sneakyboi'}
  • print("request.data:\n", request.data) 打印什么?
  • 它打印:('request.data:\n', <QueryDict: {u"{\n'email':'pizza@gmail.com',\n'password':'password',\n'codename':'sneakyass'\n}": [u'']}>)(我更改了 POST 请求,所以它与上面的不同)

标签: python django postgresql serialization


【解决方案1】:

我最终找到了一个Stack Overflow post,他们建议在其中添加extra_kwargs,其中指定它们不需要。这让我的if serializers.is_valid() 通过了!

class UserPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = User 
        fields = ('email', 'password', 'codename')
        extra_kwargs = {'email': {'required': False}, 'password': {'required': False}, 'codename': {'required': False}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多