File tree Expand file tree Collapse file tree 2 files changed +22
-4
lines changed Expand file tree Collapse file tree 2 files changed +22
-4
lines changed Original file line number Diff line number Diff line change @@ -111,6 +111,20 @@ def test_build_json_resource_obj():
111111 assert utils .build_json_resource_obj (
112112 serializer .fields , resource , resource_instance , 'user' ) == output
113113
114+ def test_extract_attributes ():
115+ fields = {
116+ 'id' : serializers .Field (),
117+ 'username' : serializers .Field (),
118+ 'deleted' : serializers .ReadOnlyField (),
119+ }
120+ resource = {'id' : 1 , 'deleted' : None , 'username' : 'jerel' }
121+ expected = {
122+ 'username' : 'jerel' ,
123+ 'deleted' : None
124+ }
125+ assert sorted (utils .extract_attributes (fields , resource )) == sorted (expected ), 'Regular fields should be extracted'
126+ assert sorted (utils .extract_attributes (fields , {})) == sorted ({'username' : '' }), 'Should not extract read_only fields on empty serializer'
127+
114128
115129class SerializerWithIncludedSerializers (EntrySerializer ):
116130 included_serializers = {
Original file line number Diff line number Diff line change @@ -239,10 +239,14 @@ def extract_attributes(fields, resource):
239239 if isinstance (field , (RelatedField , BaseSerializer , ManyRelatedField )):
240240 continue
241241
242- # Skip read_only attribute fields when the resource is non-existent
243- # Needed for the "Raw data" form of the browseable API
244- if resource .get (field_name ) is None and fields [field_name ].read_only :
245- continue
242+ # Skip read_only attribute fields when `resource` is an empty
243+ # serializer. Prevents the "Raw Data" form of the browseable API
244+ # from rendering `"foo": null` for read only fields
245+ try :
246+ resource [field_name ]
247+ except KeyError :
248+ if fields [field_name ].read_only :
249+ continue
246250
247251 data .update ({
248252 field_name : resource .get (field_name )
You can’t perform that action at this time.
0 commit comments