Restful是目前流行的設(shè)計規(guī)范糠亩,是一組架構(gòu)約束條件和原則虐骑。
GET:獲取資源
POST:新建資源
PUT:整體更新資源(列表橫列所有字段都需要傳入?yún)?shù))
DELETE:局部更新資源(列表橫列指定某一個字段傳入?yún)?shù))
DELETE:刪除資源
DRF框架的安裝和介紹
安裝: pip install djangorestframework
- 注冊應(yīng)用
INSTALLED_APPS = [
...
# DRF框架應(yīng)用
'rest_framework',
]
ERF序列化和反序列化:
- JSON序列化:將一個python對象,轉(zhuǎn)換為一個json對象(JSON字符串)
- JSON反序列化:將一個json對象(JSON字符串)赎线,轉(zhuǎn)換為python對象
序列化器的字段和約束
定義模型類
from django.db import models
# Create your models here.
class UserInfoModel(models.Model):
# 用戶信息模型類
logo = models.CharField(max_length=20, default=None, verbose_name='軟件名', help_text='軟件名')
pwd = models.CharField(max_length=20, default=None, verbose_name='密碼', help_text='密碼')
phone = models.CharField(max_length=20, default=None, verbose_name='手機號', help_text='手機號')
day = models.IntegerField(default=18, verbose_name='天數(shù)', help_text='天數(shù)')
def __str__(self):
return self.logo
# 指定建表名
class Meta:
db_table = 'userinfo'
verbose_name = '用戶信息'
定義序列化器
# 定義DRF框架的序列化器類
from rest_framework import serializers
class UserInfoSerializers(serializers.Serializer):
# 用戶信息序列化器模型類
logo = serializers.CharField(max_length=20)
pwd = serializers.CharField(max_length=20)
phone = serializers.CharField(max_length=20)
day = serializers.IntegerField(min_value=0, max_value=365)
微信截圖_20240527120524.png
關(guān)聯(lián)字段序列化操作
在序列化時廷没,會數(shù)據(jù)轉(zhuǎn)換為模型類的對象
- 關(guān)聯(lián)字段序列化方式
# 關(guān)聯(lián)字段序列化的方式
# 返回關(guān)聯(lián)模型對象的主鍵
user1 = serializers.PrimaryKeyRelatedField()
# 返回關(guān)聯(lián)字段模型類__str__方法返回的內(nèi)容
user2 = serializers.StringRelatedField()
# 返回關(guān)聯(lián)對象序列化器返回的所有字段
user3 = UserInfoSerializers()
# 返回關(guān)聯(lián)對象某一個具體字段
user4 = serializers.SlugRelatedField(read_only=True, slug_field='logo')
- 定義一個模型類
from django.db import models
# Create your models here.
class UserInfoModel(models.Model):
# 用戶信息模型類
logo = models.CharField(max_length=20, default=None, verbose_name='軟件名', help_text='軟件名')
pwd = models.CharField(max_length=20, default=None, verbose_name='密碼', help_text='密碼')
phone = models.CharField(max_length=20, default=None, verbose_name='手機號', help_text='手機號')
day = models.IntegerField(default=18, verbose_name='天數(shù)', help_text='天數(shù)')
def __str__(self):
return self.logo
# 指定建表名
class Meta:
db_table = 'userinfo'
verbose_name = '用戶信息'
class RelevanceModel(models.Model):
# 關(guān)聯(lián)UserInfoModel
user = models.ForeignKey('UserInfoModel', on_delete=models.CASCADE, verbose_name='關(guān)聯(lián)用戶表', help_text='關(guān)聯(lián)用戶表')
facility = models.CharField(max_length=20, verbose_name='使用設(shè)備', help_text='使用設(shè)備')
machine = models.CharField(max_length=200, verbose_name='機器碼', help_text='機器碼')
info = models.CharField(max_length=20, verbose_name='備注信息', help_text='備注信息')
def __str__(self):
return self.facility
- 定義一個序列化器模型類
# 定義DRF框架的序列化器類
from rest_framework import serializers
class UserInfoSerializers(serializers.Serializer):
# 用戶信息序列化器模型類
logo = serializers.CharField(max_length=20)
pwd = serializers.CharField(max_length=20)
phone = serializers.CharField(max_length=20)
day = serializers.IntegerField(min_value=0, max_value=365)
id = serializers.IntegerField()
class RelevanceSerializers(serializers.Serializer):
facility = serializers.CharField(max_length=20)
machine = serializers.CharField(max_length=200)
info = serializers.CharField(max_length=20)
id = serializers.IntegerField()
# 關(guān)聯(lián)字段序列化的方式
# 返回關(guān)聯(lián)字段模型類__str__方法返回的內(nèi)容
user1 = serializers.StringRelatedField()
反序列化操作
在反序列化時,會先對對象數(shù)據(jù)進行驗證垂寥,驗證通過再進行保存
把數(shù)據(jù)轉(zhuǎn)換為模型類的對象
# 定義DRF框架的序列化器類
from rest_framework import serializers
class UserInfoSerializers(serializers.Serializer):
# 用戶信息序列化器模型類
logo = serializers.CharField(max_length=20)
pwd = serializers.CharField(max_length=20)
phone = serializers.CharField(max_length=20)
day = serializers.IntegerField(min_value=0, max_value=365)
# read_only=True是不需要校驗的字段
id = serializers.IntegerField(read_only=True)
備注:
# 定義DRF框架的序列化器類
class UserInfoSerializers(serializers.ModelSerializer):
# 用戶信息序列化器模型類
class Meta:
# 指明參照哪個模型類
model = UserInfoModel
# 指明為模型類的哪些字段生成,__all__是所有字段
fields = '__all__'
# 可以指明只讀的字段颠黎,不參與反序列化
# read_only_fields = ('id', 'pwd')
# 指定序列化字段,反序列化的時候只會對指定序列化字段操作
# fields = ('logo', 'pwd')
# 修改字段的校驗規(guī)則(反序列化的校驗規(guī)則)
extra_kwargs = {
'phone': {'max_length': 11, 'min_length': 11, 'required': True}
}
# 可以排除指定字段滞项,指定不參與序列化
exclude = ('logo', 'pwd')