json - ModelSerializer 空字符串的字段验证

标签 json django validation serialization django-rest-framework

我在 django Rest 框架方面遇到问题。
我的前台正在向 drf 发布数据,其中一个字段可能为 null 或空字符串 ""

# models.py
class Book(models.Model):
    title = models.CharField(max_length=100)
    publication_time = models.TimeField(null=True, blank=True)


# serializers.py
from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ('id', 'title', 'publication_time')

publication_time 可以是空白""

空白案例有效,事实上,当我发布 json {"title": "yeah a book", "publication_time": none} 时,一切都很好。

当我发送 {"title": "yeah a book", "publication_time":""} 时,我确实收到验证错误 “时间格式错误。请使用其中之一格式改为:hh:mm[:ss[.uuuuuu]]。”

我尝试向序列化器类添加字段验证器:

def validate_publication_time(self, value):
    if not value:
        return None

或者甚至使用 extra_kwargs

# ....
def empty_string_to_none(value):
    if not value:
        return None    

# ....
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ('id', 'title', 'publication_time')
        extra_kwargs = {'publication_time': {'validators' : [empty_string_to_none]} }

我想做的是在任何验证发生之前或作为第一个验证规则将空字符串转换为 None (应该被序列化器和模型接受)。

问题:
问题是 validate_publication_time 从未被调用,并且在调用该函数之前我就收到了验证错误。正如我所言understood验证器的运行有特定的顺序,但现在我不知道如何解决我的问题。

问题:
我想要做的是实际清理数据,以便在运行任何验证之前将 "" 转换为 None 。是否可以?怎么办?

编辑: 这是我的序列化器的表示:

# from myapp.serializers import BookSerializer
# serializer = BookSerializer()
# print repr(serializer)
# This is the print result:
BookSerializer():
    id = IntegerField(label='ID', read_only=True)
    title = CharField(max_length=100)
    publication_time = TimeField(allow_null=True, required=False)

正如您所看到的,publication_time 字段可能为空,不是吗?

最佳答案

我也遇到了同样的问题,终于找到了解决方案。

为了在错误发生之前处理'',需要重写to_internal_value方法:

class BookSerializer(serializers.ModelSerializer):
    def to_internal_value(self, data):
        if data.get('publication_time', None) == '':
            data.pop('publication_time')
        return super(BookSerializer, self).to_internal_value(data)

关于json - ModelSerializer 空字符串的字段验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37124344/

相关文章:

javascript - Kotlin JS JSON 反序列化

javascript - 显示 JSON 请求的输出

python - 如何在 Django 基本模板中渲染查询集?

validation - 将验证与 scalaz 7 相结合

wpf - MVVM ViewModel 是否应该执行类型转换/验证?

javascript - 我如何在 javascript 中编写以下 php 代码?

c# - 'Newtonsoft.Json.JsonConvert.DeserializeObject(string)' 有一些无效参数

django - ContentType 匹配查询不存在

django - 在控制台而不是日志文件中查看主管执行

java - 我应该在哪里验证 JavaFX 属性更改?