• 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'))
    ]
  • 相关阅读:
    如何解决UITextField挡住键盘的问题
    设置UITextField中能输入的最大的字数
    如何判断IOS的设备版本型号
    IOS中如何实现对话聊天
    精美的iOS图片欣赏
    关于IOS 应用图标的设置
    ios7中添加多个按钮
    elementary0.4:快速配置工具
    elementary:网易云音乐白条解决
    deepin下eclipse快捷方式
  • 原文地址:https://www.cnblogs.com/nihao2/p/14032683.html
Copyright © 2020-2023  润新知