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
类。
默认情况下,该类上的所有模型字段都将映射到相应的序列化器字段。
如果只希望在模型序列化器中使用默认字段的子集,则可以使用fields
或exclude
选项,就像使用一样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字段,他会自己生成。 }
- 如果要设置url属性,必须要在settings的DRF全局配置里做修改
- 也可以通过在类上声明字段来向上添加额外的字段或覆盖默认字段
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(超链接模型序列化器)
HyperlinkedModelSerializer
类是类似于ModelSerializer,不同之处是它使用的超链接来建立联系,而
ModelSerializer使用的是主键。
- 默认情况下,会增加一个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'))
]