Django rest框架序列化器有效总是假的

Pat*_*osa 2 python django django-rest-framework python-3.5

我有Django的问题.我按照教程中的说法完成了所有操作,但是当我在序列化程序上检查is_valid时总是会出现错误.

这是我的代码:

models.py
from django.db import models


class User(models.Model):
    userId = models.CharField(max_length=100)
    email = models.EmailField()
Run Code Online (Sandbox Code Playgroud)

serializers.py

from .models import User
from rest_framework import serializers


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'userId', 'email')
Run Code Online (Sandbox Code Playgroud)

然后我跑了python manage.py shell.然后我使用如下命令:

from belmondoapp.models import User
from belmondoapp.serializers import UserSerializer

u = User(userId="user", email="asd@gmail.com")
s = UserSerializer(data=u)
s.is_valid() 
Run Code Online (Sandbox Code Playgroud)

它总是返回False ...为什么?我错了什么?

Lin*_*via 6

s = UserSerializer(data=u)
Run Code Online (Sandbox Code Playgroud)

应该:

s = UserSerializer(data={"userId"="user", "email"="asd@gmail.com"})
Run Code Online (Sandbox Code Playgroud)

序列化过程(从模型到字典)不需要调用is_valid:

s = UserSerializer(instance=u)
s.data
Run Code Online (Sandbox Code Playgroud)

反序列化过程(从dict到Model)不接受Model:

s = UserSerializer(data={"userId"="user", "email"="asd@gmail.com"})
s.is_valid()
s.validated_data
Run Code Online (Sandbox Code Playgroud)


Use*_*716 6

遇到相同的问题后,我想在评论部分强调@Andrea Corbellini提供的解决方案:

print(s.errors)
Run Code Online (Sandbox Code Playgroud)

将返回包含的字典fields: reason for fail。就我而言,这看起来像:

{
'start_date': [ErrorDetail(string='Expected a date but got a datetime.', code='datetime')],
'end_date': [ErrorDetail(string='Expected a date but got a datetime.', code='datetime')],
'client': [ErrorDetail(string='Incorrect type. Expected pk value, received Client.', code='incorrect_type')]
}
Run Code Online (Sandbox Code Playgroud)

我发现这绝对无价。