序列化器中的 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?
- Add rest_framework to INSTALLED_APPS
- Create a app and model
- Serialization
- Creating a viewset
- Define URLs of API
- Run server and check 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 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 是否已创建具有整体 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 文档
序列化器字段中的核心参数
Argument | Description |
---|---|
read_only | Set 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_only | Set 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. |
required | Setting this to False also allows the object attribute or dictionary key to be omitted from output when serializing the instance. |
default | If set, this gives the default value that will be used for the field if no input value is supplied. |
allow_null | Normally 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. |
source | The name of the attribute that will be used to populate the field. |
validators | A list of validator functions which should be applied to the incoming field input, and which either raise a validation error or simply return. |
error_messages | A dictionary of error codes to error messages. |
label | A short text string that may be used as the name of the field in HTML form fields or other descriptive elements. |
help_text | A text string that may be used as a description of the field in HTML form fields or other descriptive elements. |
initial | A value that should be used for pre-populating the value of HTML form fields. |
在评论中写代码?请使用 ide.geeksforgeeks.org,生成链接并在此处分享链接。