📌  相关文章
📜  序列化器中的 ModelSerializer – Django REST 框架

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

序列化器中的 ModelSerializer – Django REST 框架

ModelSerializer 是默认序列化器的抽象层,允许快速为 Django 中的模型创建序列化器。 Django REST Framework 是默认 Django 框架的包装器,主要用于创建各种 API。在通过 REST 框架创建 API 之前有三个阶段,将模型的数据转换为 JSON/XML 格式(序列化),将此数据呈现到视图,创建用于映射到视图集的 URL。本文围绕 Django REST Framework 的序列化器中的 ModelSerializer 展开。

模型序列化器

ModelSerializer 类提供了一种快捷方式,可让您自动创建具有与 Model 字段对应的字段的 Serializer 类。
ModelSerializer 类与常规 Serializer 类相同,除了:

  • 它将根据模型自动为您生成一组字段。
  • 它将自动为序列化程序生成验证器,例如 unique_together 验证器。
  • 它包括.create().update()的简单默认实现。
句法 -
class SerializerName(serializers.ModelSerializer):
    class Meta:
        model = ModelName
        fields = List of Fields

例子 -

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']

默认情况下,类上的所有模型字段都将映射到相应的序列化器字段。

如何使用 Django REST 框架创建 ModelSerializer?

将 rest_framework 添加到 INSTALLED_APPS

要在您的项目中初始化 REST 框架,请转到settings.py ,然后在 INSTALLED_APPS 的底部添加“rest_framework”

# Application definition
  
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
]

创建应用程序和模型

现在,让我们使用命令创建一个应用程序,

python manage.py startapp apis

一个名为 apis 的文件夹现在已经注册了。让我们将此应用程序添加到INSTALLED_APPS和 urls.py 中。
settings.py

# Application definition
  
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'apis',
]

现在,在 urls.py 中添加 apis url。在geeksforgeeks.urls.py中,

from django.contrib import admin
# include necessary libraries
from django.urls import path, include
  
urlpatterns = [
    path('admin/', admin.site.urls),
    # add apis urls
    path('', include("apis.urls"))
]

创建模型
为了演示、创建和使用 API,让我们创建一个名为“GeeksModel”的模型。在 apis/models.py

from django.db import models
  
class GeeksModel(models.Model):
    title = models.CharField(max_length = 200)
    description = models.TextField()
  
    def __str__(self):
        return self.title

现在我们的应用程序已经准备好了,让我们序列化数据并从中创建视图。

序列化

序列化器允许将复杂数据(例如查询集和模型实例)转换为原生Python数据类型,然后可以轻松地将其呈现为 JSON、XML 或其他内容类型。序列化器还提供反序列化,允许在首先验证传入数据后将解析的数据转换回复杂类型。让我们开始在文件apis/serializers.py中创建一个序列化程序,

# import serializer from rest_framework
from rest_framework import serializers
  
# import model from models.py
from .models import GeeksModel
  
# Create a model serializer 
class GeeksSerializer(serializers.ModelSerializer):
    # specify model and fields
    class Meta:
        model = GeeksModel
        fields = ('title', 'description')

创建视图集

要将数据呈现到前端并处理来自用户的请求,我们需要创建一个视图。在 Django REST Framework 中,我们将它们称为视图集,所以让我们在apis/views.py中创建一个视图,

# import viewsets
from rest_framework import viewsets
  
# import local data
from .serializers import GeeksSerializer
from .models import GeeksModel
  
# create a viewset
class GeeksViewSet(viewsets.ModelViewSet):
    # define queryset
    queryset = GeeksModel.objects.all()
      
    # specify serializer to be used
    serializer_class = GeeksSerializer

定义 API 的 URL

指定要访问的 API 的 url 路径,在apis/urls.py中,

# basic URL Configurations
from django.urls import include, path
# import routers
from rest_framework import routers
  
# import everything from views
from .views import *
  
# define the router
router = routers.DefaultRouter()
  
# define the router path and viewset to be used
router.register(r'geeks', GeeksViewSet)
  
# specify URL Path for rest_framework
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls'))
]

一切准备就绪后,让我们运行一些命令来激活服务器。

运行服务器并检查 API

运行以下命令创建数据库,并运行服务器,

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

现在访问http://127.0.0.1:8000/geeks/,

ModelSerializer-in-serializers-Django-REST-Framework
可以检查 ModelSerializer 是否已创建具有整体 CRUD 功能的端点。

要检查项目的代码,请单击此处

高级用法

指定要包含的字段
如果您只想在模型序列化程序中使用默认字段的子集,您可以使用字段或排除选项来执行此操作,就像使用 ModelForm 一样。
例如:

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        # specify field names
        fields = ['id', 'account_name', 'users', 'created']

或排除示例:

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        # specify field names
        exclude = ['id']

明确指定字段
可以向 ModelSerializer 添加额外的字段,或者通过在类上声明字段来覆盖默认字段,就像对 Serializer 类所做的那样。
例如,

class AccountSerializer(serializers.ModelSerializer):
    # defining fields manually
    url = serializers.CharField(source ='get_absolute_url', read_only = True)
  
    class Meta:
        # specify model
        model = Account

指定只读字段
可能希望将多个字段指定为只读。您可以使用快捷方式 Meta 选项 read_only_fields,而不是使用 read_only=True 属性显式添加每个字段。
此选项应该是字段名称的列表或元组,并声明如下:

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']
        # specify read only fields
        read_only_fields = ['account_name']

要查看有关 ModelSerializer 的更多信息,请访问 ModelSerializer 文档

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

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.