序列化器中的超链接模型序列化器 – Django REST框架
HyperlinkedModelSerializer是默认序列化器的一个抽象层,可以快速为Django中的模型创建一个序列化器。Django REST框架是对默认Django框架的一个封装,基本上用于创建各种类型的API。在通过REST框架创建API之前有三个阶段,将模型的数据转换为JSON/XML格式(序列化),将这些数据渲染到视图中,创建一个用于映射到视图集的URL。本文围绕Django REST框架的序列化器中的HyperlinkedModelSerializer展开。
HyperlinkedModelSerializer
HyperlinkedModelSerializer类与ModelSerializer类类似,只是它使用超链接来表示关系,而不是主键。默认情况下,序列化器将包括一个url字段,而不是一个主键字段。url字段将使用HyperlinkedIdentityField序列化器字段来表示,模型上的任何关系将使用HyperlinkedRelatedField序列化器字段表示。
语法 –
class SerializerName(serializers.HyperlinkedModelSerializer):
class Meta:
model = ModelName
fields = List of Fields
示例 –
class AccountSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Account
fields = ['id', 'account_name', 'users', 'created']
默认情况下,类上的所有模型字段将被映射到相应的序列化器字段。
如何使用 Django REST 框架创建一个 HyperlinkedModelSerializer
- 将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.HyperlinkedModelSerializer):
# specify model and fields
class Meta:
model = GeeksModel
fields = ('url', 'id', '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/ 。
人们可以检查HyperlinkedModelSerializer已经创建了一个具有整体CRUD功能的端点。
检查项目的代码,请点击这里
高级用法
指定要包括哪些字段
如果你只想在模型序列化器中使用默认字段的一个子集,你可以使用字段或排除选项来实现,就像你对ModelForm的操作一样。
For example:
class AccountSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Account
# specify field names
fields = ['id', 'account_name', 'users', 'created']
或排除 例子 :
class AccountSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Account
# specify field names
exclude = ['id']
指定只读字段
人们可能希望指定多个字段为只读。你可以使用快捷的Meta选项read_only_fields,而不是明确地用read_only=True属性添加每个字段。
这个选项应该是一个字段名的列表或元组,其声明方式如下。
class AccountSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Account
fields = ['id', 'account_name', 'users', 'created']
# specify read only fields
read_only_fields = ['account_name']
改变URL字段的名称。
URL字段的名称默认为 “url”。你可以通过使用URL_FIELD_NAME设置来全局地覆盖它。
class AccountSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Account
fields = ['id', 'newurl', 'account_name', 'users', 'created']
# specify read only fields
read_only_fields = ['account_name']
URL_FIELD_NAME = 'newurl'
想了解更多关于HyperlinkedModelSerializer的信息,请访问HyperlinkedModelSerializer文档。
串行器字段中的核心参数
参数 | 说明 |
---|---|
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表格字段的值。 |