@@ -130,36 +130,73 @@ impl ComputedFields {
130130 // Do not serialize computed fields
131131 return Ok ( ( ) ) ;
132132 }
133+ if extra. sort_keys {
134+ let mut sorted_fields: Vec < & ComputedField > = self . 0 . iter ( ) . collect ( ) ;
135+ sorted_fields. sort_by_cached_key ( |field| match extra. serialize_by_alias_or ( field. serialize_by_alias ) {
136+ true => field. alias . as_str ( ) ,
137+ false => field. property_name . as_str ( ) ,
138+ } ) ;
139+ for computed_field in sorted_fields {
140+ let property_name_py = computed_field. property_name_py . bind ( model. py ( ) ) ;
141+ let ( next_include, next_exclude) = match filter. key_filter ( property_name_py, include, exclude) {
142+ Ok ( Some ( ( next_include, next_exclude) ) ) => ( next_include, next_exclude) ,
143+ Ok ( None ) => continue ,
144+ Err ( e) => return Err ( convert_error ( e) ) ,
145+ } ;
133146
134- for computed_field in & self . 0 {
135- let property_name_py = computed_field. property_name_py . bind ( model. py ( ) ) ;
136- let ( next_include, next_exclude) = match filter. key_filter ( property_name_py, include, exclude) {
137- Ok ( Some ( ( next_include, next_exclude) ) ) => ( next_include, next_exclude) ,
138- Ok ( None ) => continue ,
139- Err ( e) => return Err ( convert_error ( e) ) ,
140- } ;
141-
142- let value = match model. getattr ( property_name_py) {
143- Ok ( field_value) => field_value,
144- Err ( e) => {
145- return Err ( convert_error ( e) ) ;
147+ let value = match model. getattr ( property_name_py) {
148+ Ok ( field_value) => field_value,
149+ Err ( e) => {
150+ return Err ( convert_error ( e) ) ;
151+ }
152+ } ;
153+ if extra. exclude_none && value. is_none ( ) {
154+ continue ;
146155 }
147- } ;
148- if extra. exclude_none && value. is_none ( ) {
149- continue ;
156+
157+ let field_extra = Extra {
158+ field_name : Some ( & computed_field. property_name ) ,
159+ ..* extra
160+ } ;
161+ serialize ( ComputedFieldToSerialize {
162+ computed_field,
163+ value,
164+ include : next_include,
165+ exclude : next_exclude,
166+ field_extra,
167+ } ) ?;
150168 }
169+ } else {
170+ for computed_field in & self . 0 {
171+ let property_name_py = computed_field. property_name_py . bind ( model. py ( ) ) ;
172+ let ( next_include, next_exclude) = match filter. key_filter ( property_name_py, include, exclude) {
173+ Ok ( Some ( ( next_include, next_exclude) ) ) => ( next_include, next_exclude) ,
174+ Ok ( None ) => continue ,
175+ Err ( e) => return Err ( convert_error ( e) ) ,
176+ } ;
151177
152- let field_extra = Extra {
153- field_name : Some ( & computed_field. property_name ) ,
154- ..* extra
155- } ;
156- serialize ( ComputedFieldToSerialize {
157- computed_field,
158- value,
159- include : next_include,
160- exclude : next_exclude,
161- field_extra,
162- } ) ?;
178+ let value = match model. getattr ( property_name_py) {
179+ Ok ( field_value) => field_value,
180+ Err ( e) => {
181+ return Err ( convert_error ( e) ) ;
182+ }
183+ } ;
184+ if extra. exclude_none && value. is_none ( ) {
185+ continue ;
186+ }
187+
188+ let field_extra = Extra {
189+ field_name : Some ( & computed_field. property_name ) ,
190+ ..* extra
191+ } ;
192+ serialize ( ComputedFieldToSerialize {
193+ computed_field,
194+ value,
195+ include : next_include,
196+ exclude : next_exclude,
197+ field_extra,
198+ } ) ?;
199+ }
163200 }
164201 Ok ( ( ) )
165202 }
0 commit comments