📌  相关文章
📜  序列化器中的字符串字段 – Django REST 框架

📅  最后修改于: 2022-05-13 01:55:24.468000             🧑  作者: Mango

序列化器中的字符串字段 – Django REST 框架

在 Django REST Framework 中,序列化的概念是将 DB 数据转换为 javascript 可以使用的数据类型。每个序列化程序都带有一些将要处理的字段(条目)。例如,如果您有一个名为 Employee 的类,其字段为 Employee_id、Employee_name、is_admin 等。那么,您将需要 AutoField、CharField 和 BooleanField 来通过 Django 存储和操作数据。同样,序列化器也以相同的原理工作,并具有用于创建序列化器的字段。
本文围绕 Django REST 框架中的序列化程序中的字符串字段展开。共有三个主要字段——CharField、EmailField 和 RegexField。

字符域

CharField 用于存储文本表示。可选择验证文本是否短于 max_length 且长于 min_length。它的工作原理与 CharField – Django 模型相同。
它有以下论点——

  • max_length – 验证输入包含的字符数不超过此数量。
  • min_length – 验证输入包含不少于此数量的字符。
  • allow_blank – 如果设置为 True,则空字符串应被视为有效值。如果设置为 False,则空字符串被视为无效,并会引发验证错误。默认为假。
  • trim_whitespace - 如果设置为 True 则修剪前导和尾随空格。默认为真。

句法 -

field_name = serializers.CharField(*args, **kwargs) 

电子邮件字段

EmailField 也是一种文本表示形式,它验证文本是否为有效的电子邮件地址。它与 EmailField – Django 模型相同。它采用 CharField 的所有参数来实现相同的功能。
句法 -

field_name = serializers.EmailField(*args, **kwargs) 

正则表达式字段

正如名称所定义的,RegexField 将字符串与特定的正则表达式匹配,否则会引发错误。它与 RegexField – Django Forms 相同。它采用 CharField 的所有参数来实现相同的功能。
句法 -

field_name = serializers.RegexField(*args, **kwargs)

如何在序列化程序中使用字符串字段?

为了解释字符串字段的用法,让我们使用相同的项目设置 – 如何使用 Django Rest Framework 创建基本 API?
现在您的项目中有一个名为 serializers 的文件,让我们创建一个以 CharField、EmailField 和 RegexField 作为字段的序列化程序。

Python3
#import serializer from rest_framework
from rest_framework import serializers
 
class Geeks(object):
    def __init__(self, name, email, phone_number):
        self.name = name
        self.email = email
        self.phone_number = phone_number
 
# create a serializer
class GeeksSerializer(serializers.Serializer):
    # initialize fields
    name = serializers.CharField(max_length = 200)
    email = serializers.EmailField()
    phone_number = serializers.RegexField("[0-9]{10}")


现在让我们创建一些对象并尝试序列化它们并检查它们是否真的在工作,运行,-

Python manage.py shell

现在,在 shell 中运行以下Python命令

# import everything from serializers
>>> from apis.serializers import *

# create a object of type Geeks
>>> obj = Geeks("Naveen", "abc@gmail.com", "1234567890")

# serialize the object
>>> serializer = GeeksSerializer(obj)

# print serialized data
>>> serializer.data
{'name': 'Naveen', 'email': 'abc@gmail.com', 'phone_number': '1234567890'}

这是终端上所有这些操作的输出 -

序列化器中的布尔字段

验证字符串字段

请注意,这些字段的主要座右铭是进行验证,例如 EmailField 仅将数据验证到电子邮件。让我们检查一下这些验证是否有效——

# Create a dictionary and add invalid values
>>> data={}
>>> data['name']="Naveen"
>>> data['email'] = "invalid_email"
>>> data['phone_number'] = "invalid_phone"

# dictionary created
>>> data
{'name': 'Naveen', 'email': 'invalid_email', 'phone_number': 'invalid_phone'}

# deserialize the data
>>> serializer = GeeksSerializer(data=data)

# check if data is valid
>>> serializer.is_valid()
False

# check the errors
>>> serializer.errors
{'email': [ErrorDetail(string='Enter a valid email address.', code='invalid')], 
'phone_number': [ErrorDetail(string='This value does not match the required pattern.',
code='invalid')]}

以下是这些命令的输出,清楚地显示 email 和 phone_number 无效 –

string-fields-in-serializers-Django-REST-Framework

高级概念

验证是反序列化而不是序列化的一部分。如前所述,序列化是将已经生成的数据转换为另一种数据类型的过程,因此不需要这些默认验证。反序列化需要验证,因为数据需要保存到数据库或指定的任何其他操作。因此,如果您使用这些有效的字段序列化数据。

序列化器字段中的核心参数

.math-table { 边框折叠:折叠;宽度:100%; } .math-table td { 边框:1px 实心 #5fb962;文本对齐:左!重要;填充:8px; } .math-table th { 边框:1px 实心 #5fb962;填充:8px; } .math-table tr>th{ 背景颜色:#c6ebd9;垂直对齐:中间; } .math-table tr:nth-child(odd) { background-color: #ffffff; }

ArgumentDescription
read_onlySet this to True to ensure that the field is used when serializing a representation, but is not used when creating or updating an instance during deserialization
write_onlySet this to True to ensure that the field may be used when updating or creating an instance, but is not included when serializing the representation.
requiredSetting this to False also allows the object attribute or dictionary key to be omitted from output when serializing the instance.
defaultIf set, this gives the default value that will be used for the field if no input value is supplied.
allow_nullNormally an error will be raised if None is passed to a serializer field. Set this keyword argument to True if None should be considered a valid value.
sourceThe name of the attribute that will be used to populate the field.
validatorsA list of validator functions which should be applied to the incoming field input, and which either raise a validation error or simply return.
error_messagesA dictionary of error codes to error messages.
labelA short text string that may be used as the name of the field in HTML form fields or other descriptive elements.
help_textA text string that may be used as a description of the field in HTML form fields or other descriptive elements.
initialA value that should be used for pre-populating the value of HTML form fields.