django REST框架——模型序列化器,超链接模型序列化器

官方文档:https://www.django-rest-framework.org/tutorial/1-serialization/

序列化

1.安装第三方包并注册到app

pip install djangorestframework

注册app:

INSTALLED_APPS = [
    ...
    'rest_framework',
]

2.创建models模型,

from django.db import models
from django.contrib.auth.models import User

class Course(models.Model):
    name = models.CharField(max_length=255,unique=True,help_text='课程名称',verbose_name="课程名称")
    introduction = models.TextField(help_text="课程介绍",verbose_name="介绍")
    teacher = models.ForeignKey(User,on_delete=models.CASCADE,help_text="课程讲师",verbose_name="讲师")
    price = models.DecimalField(max_digits=6,decimal_places=2,help_text="课程价格",verbose_name="定价")
    created_at = models.DateTimeField(auto_now_add=True,verbose_name="创建时间")
    updated_at = models.DateTimeField(auto_now=True,verbose_name="更新时间")

    class Meta:
        verbose_name = "课程信息"
        verbose_name_plural = verbose_name
        ordering = ('-created_at',)

    def __str__(self):
      return self.name

 

我们需要开始使用Web API的第一件事是提供一种将片段实例序列化和反序列化为诸如的表示形式的方法json。我们可以通过声明与Django形式非常相似的序列化器来实现此目的。

3.在主文件夹下新建serializers文件

<1>使用ModelSerializers(模型序列化器

就像Django提供Form类和ModelForm类一样,REST框架同时包含Serializer类和ModelSerializer类。

 

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

如果只希望在模型序列化器中使用默认字段的子集,则可以使用fieldsexclude选项,就像使用一样ModelForm。强烈建议您使用fields属性显式设置应序列化的所有字段。这将减少在模型更改时导致意外暴露数据的可能性。

 

from .models import Course
from rest_framework import serializers

class CourseSerializers(serializers.ModelSerializer):
    class Meta:
        model=Course
        fields = ('id', 'name','URL', 'introduction', 'teacher', 'price', 'created_at', 'updated_at')
        depth=2

 

  • 默认ModelSerializer使用显示主键建立联系,但是您也可以使depth选项轻松生成嵌套表示,必须是一个整数。
    • 如果要设置url属性,必须要在settings的DRF全局配置里做修改
      REST_FRAMEWORK = {
         ''''''      
          'URL_FIELD_NAME':'link'   #这样就可以在fields字段里添加link字段,他会自己生成。
      }
  • 也可以通过在类上声明字段来向上添加额外的字段或覆盖默认字段Serializer。  
    • class CourseSerializers(serializers.ModelSerializer):
          teacher = serializers.ReadOnlyField(source='teacher.username')
          class Meta:
              model=Course
              # exclude=('id',)
              # fields = '__all__'
              fields = ('id', 'name','URL', 'introduction', 'teacher', 'price', 'created_at', 'updated_at')
              depth=2
  • 除了用read_only=True属性显示添加只读字段外,还可以用Meta选项设置
    • read_only_fields = ['name']

<2>使用HyperlinkedModelSerializer(超链接模型序列化器

  1. HyperlinkedModelSerializer类是类似于ModelSerializer,不同之处是它使用的超链接来建立联系,而ModelSerializer使用的是主键。
  2. 默认情况下,会增加一个url字段,而不是主键字段,如果想要修改url名,同样要在settings的DRF里的全局配置做修改
    REST_FRAMEWORK = {
       ''''''      
        'URL_FIELD_NAME':'link'   #这样就可以在fields字段里添加link字段,它默认名为URL。
    }

  

4.可以用serializer类编写API试图,要引入rest_framework里的viewsets,编写的类要继承ModelViewSet。

from .serializers import CourseSerializers
from rest_framework import viewsets
from .models import Course
class CourseList(viewsets.ModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializers           #指定序列化模块

 

5.在url配置路由(需要引用rest_framework里的routers)

from rest_framework import routers
from course import views
router = routers.DefaultRouter()
router.register(r'course',views.CourseList)   #注册路由,访问编写的试图函数。
urlpatterns = [
path('',include(router.urls)),
path('api-auth/', include('rest_framework.urls'))
]

 

posted @ 2020-11-24 21:09  稻草人12  阅读(239)  评论(0编辑  收藏  举报