在序列多個資料時,我們需要指定一個關鍵字many=True

這是為什么呢?
其實是,當序列化器產生物件時,傳入引數many和不傳入會生成兩個不同的物件!!
這是怎么實作的呢??
1.類的物件生成--先呼叫類的__new__方法生成一個空物件
2.物件 = 類名(name=‘lz’)--會觸發類的__init__方法,產生一個有屬性的物件
3.類的__new__方法是控制物件生成
所以,找BookSerializer類的__new__方法,該類沒有就往它的父類找,最后在BaseSerializer這個類中找到了__new__方法!!
def __new__(cls, *args, **kwargs):
if kwargs.pop('many', False):
# 當 傳入many=True 執行類的many_init方法
return cls.many_init(*args, **kwargs)
# 當未傳入時,正常生成我們定義的序列化器類
return super().__new__(cls, *args, **kwargs)
many_init該方法意思是單次生成多個我們自己定義的BookSerializer物件,然后添加到串列中!!
@classmethod
def many_init(cls, *args, **kwargs):
allow_empty = kwargs.pop('allow_empty', None)
max_length = kwargs.pop('max_length', None)
min_length = kwargs.pop('min_length', None)
child_serializer = cls(*args, **kwargs)
list_kwargs = {
'child': child_serializer,
}
if allow_empty is not None:
list_kwargs['allow_empty'] = allow_empty
if max_length is not None:
list_kwargs['max_length'] = max_length
if min_length is not None:
list_kwargs['min_length'] = min_length
list_kwargs.update({
key: value for key, value in kwargs.items()
if key in LIST_SERIALIZER_KWARGS
})
meta = getattr(cls, 'Meta', None)
list_serializer_class = getattr(meta, 'list_serializer_class', ListSerializer)
return list_serializer_class(*args, **list_kwargs)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516316.html
標籤:Python
