Django rest框架序列化器始终无效。

11

我遇到了Django的问题。我按照教程上的步骤做了一切,但是当我在序列化器上检查is_valid时,它总是返回false。

以下是我的代码:

models.py
from django.db import models


class User(models.Model):
    userId = models.CharField(max_length=100)
    email = models.EmailField()

serializers.py

from .models import User
from rest_framework import serializers


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'userId', 'email')

然后我运行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() 

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


11
调用s.is_valid()后,检查s.errors - Andrea Corbellini
顺便说一下,我认为问题在于你的 u 没有一个ID(这是你的序列化器所需要的)你应该先保存它。 - Andrea Corbellini
通过调用 s.errors,我得到了“{'non_field_errors': ['Invalid data. Expected a dictionary, but got User。']}” - Patryk Imosa
当我使用u.save()时,它会添加到用户中,然后我将其传递给序列化程序,例如UserSerializer(u),现在s.data是可见的,但是当我放置UserSerialize(data=u)并且然后s.is_valid()为false...也许是因为具有相同id的用户已经存在? - Patryk Imosa
3个回答

26

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

print(s.errors)

将返回一个包含字段: fail原因的字典。在我的案例中,它看起来像:

返回结果为:

将返回一个包含字段: 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')]
}

我发现这非常有价值。


1
非常有用。使用它找到了我的错误。其中一个DateField的格式有问题。如果有人在阅读,请在您的序列化器DateField参数中添加input_formats=['插入日期格式'] - AeroHil
1
太棒了!我也遇到了同样的错误,结果发现我的一个字段是必须的,但我没有传递任何值。 - Rayyan

8
s = UserSerializer(data=u)

should be:

s = UserSerializer(data={"userId"="user", "email"="asd@gmail.com"})

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

s = UserSerializer(instance=u)
s.data

反序列化过程(从字典到模型)不接受模型:
s = UserSerializer(data={"userId"="user", "email"="asd@gmail.com"})
s.is_valid()
s.validated_data

2
如果您想查看异常详细信息,请将 raise_exception 参数设置为 True,即 obj.is_valid(raise_exception=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接