@@ -130,36 +130,73 @@ impl ComputedFields {
130
130
// Do not serialize computed fields
131
131
return Ok ( ( ) ) ;
132
132
}
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
+ } ;
133
146
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 ;
146
155
}
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
+ } ) ?;
150
168
}
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
+ } ;
151
177
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
+ }
163
200
}
164
201
Ok ( ( ) )
165
202
}
0 commit comments