python測試開發django-65.序列化(ModelSerializer)

  • 2019 年 10 月 5 日
  • 筆記

前言

serializers.Serializer可以對modle模型中的字段序列化,並且必須寫create和update兩個方法。ModelSerializer可以看成是Serializer的一個升級版,功能更強大,更方便。 實際上ModelSerializer類繼承了Serializer類。

ModelSerializer

ModelSerializer類能夠讓你自動創建一個具有模型中相應字段的Serializer類。這個ModelSerializer類和常規的Serializer類一樣,不同的是:

  • 它根據模型自動生成一組字段。
  • 它自動生成序列化器的驗證器,比如unique_together驗證器。
  • 它默認簡單實現了.create()方法和.update()方法。

比如我們創建的一個模型models.py

# models.py  from django.db import models  # 作者:上海悠悠,QQ交流群:750815713    # Create your models here.  class UserPersonalInfo(models.Model):      '''用戶個人信息'''      name = models.CharField(max_length=10, verbose_name="昵稱")  # 昵稱      sex_choices = (          (u'M', u'男'),          (u'F', u'女'),      )      sex = models.CharField(max_length=11,                             choices=sex_choices,                             verbose_name="性別",                              )      age = models.IntegerField(verbose_name="年齡",  default="", blank=True)      mail = models.EmailField(max_length=30, default="", blank=True)      create_time = models.DateField(auto_now=True, verbose_name="添加時間")

使用ModelSerializer序列化後如下

# serializersapi.py  from rest_framework import serializers  from .models import UserPersonalInfo  # 作者:上海悠悠,QQ交流群:750815713    class UserInfoSerializer(serializers.ModelSerializer):      class Meta:          model = UserPersonalInfo          fields = '__all__'

fields參數設置為'__all__'會默認序列化所有的字段,可以在django shell交互模式查看

D:softyoyoapi>python manage.py shell  Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32  Type "help", "copyright", "credits" or "license" for more information.  (InteractiveConsole)  >>> from apiapp.serializersapi import UserInfoSerializer  >>> serializer = UserInfoSerializer()  >>> print(repr(serializer))  UserInfoSerializer():      id = IntegerField(label='ID', read_only=True)      name = CharField(label='昵稱', max_length=10)      sex = ChoiceField(choices=(('M', '男'), ('F', '女')), label='性別')      age = IntegerField(label='年齡', max_value=2147483647, min_value=-2147483648, required=False)      mail = EmailField(allow_blank=True, max_length=30, required=False)      create_time = DateField(label='添加時間', read_only=True)  >>>

fields指定要包括的字段

如果我只想要其中的幾個字段,如』id』, 『name』, 『mail』, 『create_time』,那麼fields參數可以設置成元組類型

# serializersapi.py  from rest_framework import serializers  from .models import UserPersonalInfo  # 作者:上海悠悠,QQ交流群:750815713    class UserInfoSerializer(serializers.ModelSerializer):      class Meta:          model = UserPersonalInfo          fields = ('id', 'name', 'mail', 'create_time')

修改代碼後,需exit()退出shell,再重新進。django shell交互模式運行查看結果

D:softyoyoapi>python manage.py shell  Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32  Type "help", "copyright", "credits" or "license" for more information.  (InteractiveConsole)  >>> from apiapp.serializersapi import UserInfoSerializer  >>> serializer = UserInfoSerializer()  >>> print(repr(serializer))  UserInfoSerializer():      id = IntegerField(label='ID', read_only=True)      name = CharField(label='昵稱', max_length=10)      mail = EmailField(allow_blank=True, max_length=30, required=False)      create_time = DateField(label='添加時間', read_only=True)  >>>

exclude排除字段列表

fields屬性設置相反的是,可以用exclude排除部分字段

# serializersapi.py  from rest_framework import serializers  from .models import UserPersonalInfo  # 作者:上海悠悠,QQ交流群:750815713    class UserInfoSerializer(serializers.ModelSerializer):      class Meta:          model = UserPersonalInfo          # fields = ('id', 'name', 'mail', 'create_time')          exclude = ('id', 'sex', 'age')

django shell交互模式查看結果

# 作者:上海悠悠,QQ交流群:750815713  D:softyoyoapi>python manage.py shell  Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32  Type "help", "copyright", "credits" or "license" for more information.  (InteractiveConsole)  >>> from apiapp.serializersapi import UserInfoSerializer  >>> serializer = UserInfoSerializer()  >>> print(repr(serializer))  UserInfoSerializer():      name = CharField(label='昵稱', max_length=10)      mail = EmailField(allow_blank=True, max_length=30, required=False)      create_time = DateField(label='添加時間', read_only=True)  >>>

上面例子中用 exclude參數會排除掉』id』, 『sex』, 『age』這三個參數。

案例操作

接下來使用serializers.ModelSerializer序列化後(設置fields = 『all『),寫個簡單的案例,編輯views.py視圖,在上一篇基礎上,改這一句即可

verify_data = UserInfoSerializer(data=request.data) # 只改這裡

# views.py  from rest_framework.response import Response  from rest_framework.views import APIView  from .models import *  from rest_framework.permissions import IsAuthenticated,AllowAny  from .serializersapi import UserInfoSerializer    class UserInfoView(APIView):      '''REST framework的APIView實現獲取card列表 # 作者:上海悠悠,QQ交流群:750815713'''      # authentication_classes = (TokenAuthentication,)  # token認證      # permission_classes = (IsAuthenticated,)   # IsAuthenticated 僅通過認證的用戶      permission_classes = (AllowAny,)  # 允許所有用戶        def get(self, request, format=None):          """          Return a list of all UserPersonalInfo          """          info = UserPersonalInfo.objects.all()          serializer = UserInfoSerializer(info, many=True)          return Response(serializer.data)        def post(self, request, format=None):          '''          create UserPersonalInfo          '''          verify_data = UserInfoSerializer(data=request.data)  # 只改這裡          if verify_data.is_valid():              verify_data.save()              return Response({"message": "create some data!", "data": request.data})          else:              return Response(verify_data.errors)

urls.py設置訪問地址

# urls.py  from apiapp import views  from django.conf.urls import url    # 作者:上海悠悠,QQ交流群:750815713    urlpatterns = [      url(r'^info', views.UserPersonalInfoView.as_view()),  ]

測試接口

GET請求訪問http://127.0.0.1:8000/info,查詢結果

POST請求提交http://127.0.0.1:8000/info,測試結果