1. 程式人生 > 實用技巧 >django REST框架——模型序列化器,超連結模型序列化器

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'))
]