前言
ModelSerializer 反序列化的時候,設置 read_only=True 可以忽略傳過來的字段,不寫入到數據庫。
那么從數據庫讀出來的數據,序列化返回出來的時候,不顯示某個字段,可以設置write_only=True
設置 read_only=True
接着前面這篇https://www.cnblogs.com/yoyoketang/p/14342631.html
不想讓用戶創建的時候設置下架,於是可以忽略 goods_status(商品狀態) 字段, 設置 read_only=True
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
class GoodsSerializer(serializers.ModelSerializer):
"""序列化商品models"""
create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S',required=False)
update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S',required=False)
# 必傳字段
goods_code = serializers.CharField(required=True)
goods_stock = serializers.IntegerField(required=True)
# 忽略字段,設置read_only=True
goods_status = serializers.IntegerField(read_only=True)
class Meta:
model = Goods
fields = '__all__' # 返回全部的字段
設置 write_only=True
price是商品的成本價,用戶在獲取全部商品的時候,查詢的時候不希望顯示price,但是創建商品的時候,可以傳price過去保存到數據庫
class GoodsSerializer(serializers.ModelSerializer):
"""序列化商品models"""
create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
# 必傳字段
goods_code = serializers.CharField(required=True,
max_length=15,
min_length=8,
)
goods_stock = serializers.IntegerField(required=True,
min_value=1,
max_value=10000)
# 忽略字段,設置read_only=True
goods_status = serializers.IntegerField(read_only=True)
# 設置write_only=True
price = serializers.FloatField(write_only=True)
class Meta:
model = Goods
fields = '__all__' # 返回全部的字段
這時候查詢的時候就不顯示price
但是創建商品的時候,price字段是可以被寫入的
查詢數據庫會看到已經寫入到數據庫了
exclude 排除字段
如果某個字段我們既不希望用戶傳到數據庫,也不希望查詢的時候顯示給用戶,那么可以用 exclude 排除字段的校驗。
如下排除 goods_groupid 商品分組字段的校驗
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
class GoodsSerializer(serializers.ModelSerializer):
"""序列化商品models"""
create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
# 必傳字段
goods_code = serializers.CharField(required=True,
max_length=15,
min_length=8,
)
goods_stock = serializers.IntegerField(required=True,
min_value=1,
max_value=10000)
# 忽略字段,設置read_only=True
goods_status = serializers.IntegerField(read_only=True)
# 設置write_only=True
price = serializers.FloatField(write_only=True)
class Meta:
model = Goods
# fields = '__all__' # 返回全部的字段
# exclude是不包含某些字段
exclude = ["goods_groupid"]
提交數據的時候,帶上goods_groupid參數,並不會寫入到數據庫,也不會被查詢出來
通過本篇的學習也就弄清楚了read_only=True
和 write_only=True
和 exclude
的區別了。