手把手程式實作分享系列: Django Serializers 修改Fields 參數 進階用法
這次文章比較簡短一點,主要記錄這一篇的原因,是因為自己在寫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'}
如果有一天,使用者只想要輸出id
、image
和title
這三個參數,其它都不需要,那直覺的方式是把models.Slides
再給他一個的Serializer:SlidesLiteSerializer
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