手把手程式實作分享系列: Django Serializers 修改Fields 參數 進階用法

Walter Chiu
Bandai的機器學習筆記
5 min readNov 6, 2020

這次文章比較簡短一點,主要記錄這一篇的原因,是因為自己在寫code時

常常不一定需要輸出這麼多table的參數,會讓前端資訊太多,所以就來這一篇拉。

先打開Serializers.py 來個範例code

class SlidesSerializer(serializers.ModelSerializer):
class Meta:
model = models.Slides
fields = ('id', 'title', 'image', 'url', 'no',)

使用Django的朋友應該很了解上面的code了吧,我們在使用資料庫時一定會常常用到Serializer進行序列化的操作。範例裡面SlidesSerializer Meta
是指定Model對象 models.Slides序列化成並且由其 fields那一些參數性來顯示

#序列化之后的models.Slides对象
{'id': 2, 'title': '你好', 'image': '/daodi.png', 'url': 'www.daodikeji.com', 'no': 'DD_BJ_001'}

如果有一天,使用者只想要輸出idimagetitle這三個參數,其它都不需要,那直覺的方式是把models.Slides再給他一個的SerializerSlidesLiteSerializer

class SlidesSerializer(serializers.ModelSerializer):
class Meta:
model = models.Slides
fields = ('id', 'title', 'image', 'url', 'no',)
#精簡版
class SlidesLiteSerializer(serializers.ModelSerializer):
class Meta:
model = models.Slides
fields = ('id', 'title','image',)

但是如果要很多個怎麼辦….好像不夠好用

所以找了找官網,官網api教學,以下code範例

class SlidesSerializer(serializers.ModelSerializer):
"""
此處的`fields`字段是用來替換上面Serializer內部Meta類中指定的`fields`屬性值
"""
def __init__(self, *args, **kwargs):
# 在super執行之前
# 將傳遞的`fields`中的字段從kwargs取出並剔除,避免其傳遞給基類ModelSerializer
# 注意此處`fields`中在默認`self.fields`屬性中不存在的字段將無法被序列化 也就是`fields`中的字段應該
# 是`self.fields`的子集
fields = kwargs.pop('fields', None)
super(BaseModeSerializer, self).__init__(*args, **kwargs) if fields is not None:

allowed = set(fields)
existing = set(self.fields.keys())
for field_name in existing - allowed:
self.fields.pop(field_name)
class Meta:
model = models.Slides
fields = ('id', 'title', 'image', 'url', 'no',)

最後轉到view.py

看一下下面的範例,把需要的參數打進去fields就可以得到相對應的參數了

像是fields=('id', 'title') 就可以得到id跟title的參數
改成fields=('id', 'title','image') 的話就可以得到id,title,image三個參數

>>> print SlidesSerializer(sides)
{'id': 2, 'title': '你好', 'image': '/daodi.png', 'url': 'www.daodikeji.com', 'no': 'DD_BJ_001'}
>>> print SlidesSerializer(sides, fields=('id', 'title'))
{'id': 2, 'title': '你好'}
>>> print SlidesSerializer(sides, fields=('id', 'title','image'))
{'id': 2, 'title': '你好', 'image': '/daodi.png'}

這一篇我也會放到大整理裡面去,需要看其他django的文章就去裡面挖挖寶吧。https://medium.com/bandai%E7%9A%84%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98/django-%E4%BB%8B%E7%B4%B9-%E6%89%8B%E6%8A%8A%E6%89%8B%E5%AD%B8%E7%BF%92%E6%8C%87%E5%8D%97-1d4cf6efaf8f

--

--

Walter Chiu
Bandai的機器學習筆記

台大電機博士候選人,主要學習電腦科學、資訊教育,關心各種時事議題,歡迎一起討論有趣的專題 dodo0095@hotmail.com