Leo*_*rdo 4 django validation serialization json 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')
Run Code Online (Sandbox Code Playgroud)
publication_time可以是blank或""。
空白案例有效,实际上当我发布 json 时{"title": "yeah a book", "publication_time": none}一切都很好。
当我发送时,{"title": "yeah a book", "publication_time":""}我确实收到验证错误"Time has wrong format. Use one of these formats instead: hh:mm[:ss[.uuuuuu]]."
我尝试向序列化程序类添加字段验证器:
def validate_publication_time(self, value):
if not value:
return None
Run Code Online (Sandbox Code Playgroud)
甚至使用 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]} }
Run Code Online (Sandbox Code Playgroud)
我想要做的是在任何验证发生之前或作为第一个验证规则之前将空字符串转换为 None (应该被序列化程序和模型接受)。
问题:
问题是validate_publication_time从来没有调用过,我什至在点击函数之前就收到了验证错误。正如我理解存在这样的验证运行特定的顺序,但现在我不知道如何解决我的问题。
问题:
我想要做的是实际清理数据,以便在运行任何验证之前转换""为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)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样,publication_time 字段可能为空,不是吗?
小智 9
我遇到了同样的问题,终于找到了解决方案。
为了''在错误发生前进行处理,需要重写该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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8046 次 |
| 最近记录: |