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

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

序列化程序中的 HyperlinkedModelSerializer – Django REST 框架

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

要在您的项目中初始化 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.HyperlinkedModelSerializer):
    # specify model and fields
    class Meta:
        model = GeeksModel
        fields = ('url', 'id', '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/,

超链接模型序列化器-Django-REST-Framework

可以检查 HyperlinkedModelSerializer 是否已创建具有整体 CRUD 功能的端点。

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

高级用法

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

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

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

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.