Django 欄位型別,欄位引數,以及在drf中的使用。
阿新 • • 發佈:2022-04-01
欄位型別
# models中CharField,DecimalField.....
# 記住的:
CharField
IntegerField
FloatField
DecimalField
DateTimeField
DateField
# 知道--》models中沒有的---》反序列化的時候,前端傳入的
{name:lqz,age:19,hobby:[籃球,足球],wife:{name:lyf,age:38}}
ListField
DictField
欄位 | 欄位構造方式 |
---|---|
BooleanField | BooleanField() |
NullBooleanField |
NullBooleanField() |
CharField | CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True) |
EmailField | EmailField(max_length=None, min_length=None, allow_blank=False) |
RegexField | RegexField(regex, max_length=None, min_length=None, allow_blank=False) |
SlugField | SlugField(maxlength=50, min_length=None, allow_blank=False) 正則欄位,驗證正則模式 [a-zA-Z0-9 |
URLField | URLField(max_length=200, min_length=None, allow_blank=False) |
UUIDField | UUIDField(format=’hex_verbose’) format: 1) 'hex_verbose' 如"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex' 如 "5ce0e9a55ffa654bcee01238041fb31a" 3)'int' - 如: "123456789012312313134124512351145145114" 4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a" |
IPAddressField | IPAddressField(protocol=’both’, unpack_ipv4=False, **options) |
IntegerField | IntegerField(max_value=None, min_value=None) |
FloatField | FloatField(max_value=None, min_value=None) |
DecimalField | DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位數 decimal_palces: 小數點位置 |
DateTimeField | DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None) |
DateField | DateField(format=api_settings.DATE_FORMAT, input_formats=None) |
TimeField | TimeField(format=api_settings.TIME_FORMAT, input_formats=None) |
DurationField | DurationField() |
ChoiceField | ChoiceField(choices) choices與Django的用法相同 |
MultipleChoiceField | MultipleChoiceField(choices) |
FileField | FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
ImageField | ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
ListField | ListField(child=, min_length=None, max_length=None) |
DictField | DictField(child=) |
欄位引數
# 寫在欄位類中的引數--》如:max_length。。。
# 重點:
read_only:表明該欄位僅用於序列化輸出,預設False
-如果read_only=True,這個欄位只用來做序列化---》把物件---》json給前端
write_only:表明該欄位僅用於反序列化輸入,預設False
-如果read_only=write_only,這個欄位只用來做反序列化---》前端json---》存到資料庫
# 舉例
name=serializers.CharField(max_length=32,min_length=3)
price=serializers.CharField(write_only=True,read_only=True)
author=serializers.CharField(write_only=True)
# 什麼都不寫,表示既序列化,又反序列化
# 序列化給前端,前端看到的欄位樣子---》只能看到name
# 反序列化,前端需要傳什麼過來name,price,author都傳
# write_only=True,read_only=True 邏輯矛盾
選項引數:
引數名稱 | 作用 |
---|---|
max_length | 最大長度(CharField) |
min_lenght | 最小長度(CharField) |
allow_blank | 是否允許為空(CharField) |
trim_whitespace | 是否截斷空白字元(CharField) |
max_value | 最小值 (IntegerField) |
min_value | 最大值(IntegerField) |
通用引數:
引數名稱 | 說明 |
---|---|
read_only | 表明該欄位僅用於序列化輸出,預設False |
write_only | 表明該欄位僅用於反序列化輸入,預設False |
required | 表明該欄位在反序列化時必須輸入,預設True |
default | 反序列化時使用的預設值 |
allow_null | 表明該欄位是否允許傳入None,預設False |
validators | 該欄位使用的驗證器(不太用) |
error_messages | 包含錯誤編號與錯誤資訊的字典 |
label | 用於HTML展示API頁面時,顯示的欄位名稱 |
help_text | 用於HTML展示API頁面時,顯示的欄位幫助提示資訊 |
序列化時,定製序列化的欄位
### 兩種方案
# 作用?比如author關聯了外來鍵,想取出作者詳情
# author_info = serializers.SerializerMethodField()
# def get_author_info(self,obj):
# return {'name':obj.author.name,'age':obj.author.age}
# 第一種:在序列化類中寫
# price_info = serializers.SerializerMethodField() # 必須配合一個方法,方法名get_欄位名
# def get_price_info(self, obj): # 方法返回什麼,欄位就是什麼,obj是當前序列化到的單個物件
# return "價格是:"+str(obj.price) # python是動態強型別語言--》強型別是:不同型別之間不允許直接運算
# 第二種方案:在models中寫方法,這裡欄位名就是models的方法名,price_info方法返回什麼,這個欄位就是什麼
# price_info=serializers.CharField()
authors=serializers.ListField()
序列化類中寫
price_info = serializers.SerializerMethodField() # 必須配合一個方法,方法名get_欄位名
def get_price_info(self, obj): # 方法返回什麼,欄位就是什麼,obj是當前序列化到的單個物件
return "價格是:"+str(obj.price) # python是動態強型別語言--》強型別是:不同型別之間不允許直接運算
表模型中寫
# 表模型中寫方法
@property # 把方法包裝成資料屬性
def price_info(self):
return "價格是:" + str(self.price)
# 序列化類中使用
price_info=serializers.CharField(read_only=True) # 只用來做序列化
# authors=serializers.ListField()
擴充套件on_delete:
on_delete
當刪除關聯表中的資料時,當前表與其關聯的行的行為。
models.CASCADE
刪除關聯資料,與之關聯也刪除
models.DO_NOTHING
刪除關聯資料,引發錯誤IntegrityError
models.PROTECT
刪除關聯資料,引發錯誤ProtectedError
models.SET_NULL
刪除關聯資料,與之關聯的值設定為null(前提FK欄位需要設定為可空)
models.SET_DEFAULT
刪除關聯資料,與之關聯的值設定為預設值(前提FK欄位需要設定預設值)
models.SET
刪除關聯資料,
a. 與之關聯的值設定為指定值,設定:models.SET(值)
b. 與之關聯的值設定為可執行物件的返回值,設定:models.SET(可執行物件)