【问题标题】:Django rest framework serializer is valid always falseDjango rest 框架序列化程序有效总是错误的
【发布时间】:2016-07-28 17:24:17
【问题描述】:

我对 Django 有疑问。我按照教程中的内容做了所有操作,但是当我在序列化程序上检查 is_valid 时,总是错误的。

这是我的代码:

models.py
from django.db import models


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

序列化器.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... 为什么?我做错了什么?

【问题讨论】:

  • 调用s.is_valid()后检查s.errors
  • 顺便说一句,我认为问题在于您的u 没有ID(您的序列化程序需要该ID)。你应该先保存它
  • 我通过调用 s.errors 得到了{'non_field_errors': ['Invalid data. Expected a dictionary, but got User.']}
  • 当我使用 u.save() 然后它被添加到 User 然后我将它传递给像 UserSerializer(u) 这样的序列化程序,现在 s.data 是可见的,但是当我把 UserSerialize(data=u ) 然后 s.is_valid() 是假的......也许是因为存在具有相同 id 的用户?

标签: python django django-rest-framework python-3.5


【解决方案1】:

如果您想查看异常详细信息,请使用 raise_exception 参数作为 True

obj.is_valid(raise_exception=True)

【讨论】:

    【解决方案2】:

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

    print(s.errors)
    

    将返回包含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')]
    }
    

    我发现这绝对是无价之宝。

    【讨论】:

    • 超级有帮助。使用这个发现我的错误。它是 DateField 之一的格式。如果有人正在阅读,请在您的序列化程序 DateField 参数中添加input_formats=['insert some date format here']
    • 很棒的答案!我遇到了同样的错误,结果发现我的一个字段是必需的,但我什么也没传递。
    【解决方案3】:
    s = UserSerializer(data=u)
    

    应该是:

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

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

    s = UserSerializer(instance=u)
    s.data
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 2017-10-03
      • 2019-05-20
      • 2022-01-08
      相关资源
      最近更新 更多