串行器中的JSONField – Django REST框架
在Django REST框架中,序列化的概念是将数据库数据转换为可被javascript使用的数据类型。每个序列化器都有一些将要被处理的字段(条目)。例如,如果你有一个名为Employee的类,其字段为Employee_id, Employee_name, is_admin等。那么,你就需要AutoField、CharField和BooleanField来通过Django存储和操作数据。同样,序列化器的工作原理也是一样的,也有用于创建序列化器的字段。本文围绕Django REST框架中序列器的JSONField展开。
JSONField
JSONField基本上是一个字段类,它验证传入的数据结构是否由有效的JSON基元组成。在其备用的二进制模式下,它将表示并验证JSON编码的二进制字符串。它有以下参数 –
- binary – 如果设置为True,那么该字段将输出并验证一个JSON编码的字符串,而不是一个原始数据结构。默认为False。
- encoder – 使用这个JSON编码器来序列化输入对象。默认为无。
语法 –
field_name = serializers.JSONField(*args, **kwargs)
如何在序列化程序中使用JSONField
为了解释JSONField的用法,让我们使用相同的项目设置–如何使用Django Rest框架创建一个基本的API?现在你的项目中有一个名为serializers的文件,让我们创建一个以JSONField为字段的serializer。
# import serializer from rest_framework
from rest_framework import serializers
class Geeks(object):
def __init__(self, json_data):
self.json_data = json_data
# create a serializer
class GeeksSerializer(serializers.Serializer):
# initialize fields
json_data = serializers.JSONField()
现在让我们创建一些对象,并尝试将它们序列化,检查它们是否真的能工作,运行,-
Python manage.py shell
现在,在shell中运行以下python命令
# create a json object
>>> import json
>>> x = json.dumps({"name":"Naveen", "Age":"21"})
>>> x
'{"name": "Naveen", "Age": "21"}'
# import everything from serializers
>>> from apis.serializers import *
# create a object of type Geeks
>>> obj = Geeks(x)
# serialize the object
>>> serializer = GeeksSerializer(obj)
# print serialized data
>>> serializer.data
{'json_data': '{"name": "Naveen", "Age": "21"}'}
对JSONField的验证
请注意,这些字段的主要目的是传递验证信息,例如JSONField只验证JSON数据。让我们检查一下这些验证是否有效。
# Create a dictionary and add invalid values
>>> data = {}
>>> data['json_data'] = x
# dictionary created
>>> data
{'json_data': '{"name": "Naveen", "Age": "21"}'}
# deserialize the data
>>> serializer = GeeksSerializer(data=data)
# check if data is valid
>>> serializer.is_valid()
True
# check the errors
>>> serializer.errors
{}
高级概念
验证是反序列化的一部分,而不是序列化。正如前面所解释的,序列化是将已经生成的数据转换为另一种数据类型的过程,所以不需要这些默认的验证。反序列化需要验证,因为数据需要被保存到数据库或任何其他指定的操作。因此,如果你使用这些字段来序列化数据,就可以了。
串行器字段中的核心参数
参数 | 说明 |
---|---|
read_only | 将此设置为True,以确保在序列化表示时使用该字段,但在反序列化期间创建或更新实例时不使用该字段。 |
Write_only | 将此设置为True,以确保在更新或创建实例时可以使用该字段,但在序列化表示时不包括在内。 |
required | 将此设置为False也允许在序列化实例时从输出中省略对象属性或字典键。 |
default | 如果设置,这将给出默认值,如果没有提供输入值,将用于该字段。 |
allow_null | 通常情况下,如果None被传递给一个序列化器字段,将会产生一个错误。如果None被认为是一个有效的值,请将这个关键字参数设置为True。 |
source | 将被用于填充字段的属性名称。 |
validators | 一个验证器函数的列表,这些函数应该应用于输入的字段,它们要么引发验证错误,要么简单地返回。 |
error_messages | 一个错误代码的字典,用于错误信息。 |
label | 一个简短的文本字符串,可作为HTML表格字段或其他描述性元素中的字段名称。 |
help_text | 一个文本字符串,可作为HTML表单字段或其他描述性元素的描述。 |
initial | 一个应该用于预先填充HTML表格字段的值。 |