串行器中的ModelSerializer – Django REST框架

串行器中的ModelSerializer – Django REST框架

ModelSerializer是在默认的序列化器之上的一个抽象层,可以快速为Django中的模型创建一个序列化器。Django REST框架是对默认Django框架的一个封装,基本上用于创建各种类型的API。在通过REST框架创建API之前有三个阶段,将模型的数据转换为JSON/XML格式(序列化),将这些数据渲染到视图中,创建一个用于映射到视图集的URL。本文围绕Django REST框架的序列化器中的ModelSerializer展开。

ModelSerializer

ModelSerializer类提供了一个快捷方式,让你自动创建一个Serializer类,其字段与Model字段对应。
ModelSerializer类与普通的Serializer类相同,只是。

  • 它将根据模型自动为你生成一组字段。
  • 它将自动为序列化器生成验证器,例如唯一的验证器。
  • 它包括.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。
  • 创建一个应用程序和模型
  • Serialization
  • 创建一个视图集
  • 定义API的URLs
  • 运行服务器并检查API

将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 urls。在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

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

序列化

序列化器允许复杂的数据,如querysets和模型实例,被转换为本地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框架中,我们称这些为视图集,所以让我们在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的URLs

指定要访问的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 - Django REST框架
人们可以检查ModelSerializer已经创建了一个具有整体CRUD功能的端点。

高级用法

指定要包括哪些字段
如果你只想在模型序列化器中使用默认字段的一个子集,你可以使用字段或排除选项来实现,就像你对ModelForm的操作一样。
For example:

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类一样。
For example,

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文档

串行器字段中的核心参数

参数 说明
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表格字段的值。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程