@@ -52,12 +52,29 @@ impl ComputedFields {
5252 // Do not serialize computed fields
5353 return Ok ( ( ) ) ;
5454 }
55- for computed_field in & self . 0 {
56- let field_extra = Extra {
57- field_name : Some ( computed_field. property_name . as_str ( ) ) ,
58- ..* extra
59- } ;
60- computed_field. to_python ( model, output_dict, filter, include, exclude, & field_extra) ?;
55+
56+ if extra. sort_keys {
57+ let mut sorted_fields: Vec < & ComputedField > = self . 0 . iter ( ) . collect ( ) ;
58+ sorted_fields. sort_by_cached_key ( |field| match extra. serialize_by_alias_or ( field. serialize_by_alias ) {
59+ true => field. alias . as_str ( ) ,
60+ false => field. property_name . as_str ( ) ,
61+ } ) ;
62+
63+ for computed_field in sorted_fields {
64+ let field_extra = Extra {
65+ field_name : Some ( computed_field. property_name . as_str ( ) ) ,
66+ ..* extra
67+ } ;
68+ computed_field. to_python ( model, output_dict, filter, include, exclude, & field_extra) ?;
69+ }
70+ } else {
71+ for computed_field in & self . 0 {
72+ let field_extra = Extra {
73+ field_name : Some ( computed_field. property_name . as_str ( ) ) ,
74+ ..* extra
75+ } ;
76+ computed_field. to_python ( model, output_dict, filter, include, exclude, & field_extra) ?;
77+ }
6178 }
6279 Ok ( ( ) )
6380 }
@@ -76,33 +93,71 @@ impl ComputedFields {
7693 return Ok ( ( ) ) ;
7794 }
7895
79- for computed_field in & self . 0 {
80- let property_name_py = computed_field. property_name_py . bind ( model. py ( ) ) ;
96+ if extra. sort_keys {
97+ let mut sorted_fields: Vec < & ComputedField > = self . 0 . iter ( ) . collect ( ) ;
98+ sorted_fields. sort_by_cached_key ( |field| match extra. serialize_by_alias_or ( field. serialize_by_alias ) {
99+ true => field. alias . as_str ( ) ,
100+ false => field. property_name . as_str ( ) ,
101+ } ) ;
102+
103+ for computed_field in sorted_fields {
104+ let property_name_py = computed_field. property_name_py . bind ( model. py ( ) ) ;
81105
82- if let Some ( ( next_include, next_exclude) ) = filter
83- . key_filter ( property_name_py, include, exclude)
84- . map_err ( py_err_se_err) ?
85- {
86- let value = model. getattr ( property_name_py) . map_err ( py_err_se_err) ?;
87- if extra. exclude_none && value. is_none ( ) {
88- continue ;
106+ if let Some ( ( next_include, next_exclude) ) = filter
107+ . key_filter ( property_name_py, include, exclude)
108+ . map_err ( py_err_se_err) ?
109+ {
110+ let value = model. getattr ( property_name_py) . map_err ( py_err_se_err) ?;
111+ if extra. exclude_none && value. is_none ( ) {
112+ continue ;
113+ }
114+ let field_extra = Extra {
115+ field_name : Some ( computed_field. property_name . as_str ( ) ) ,
116+ ..* extra
117+ } ;
118+ let cfs = ComputedFieldSerializer {
119+ model,
120+ computed_field,
121+ include : next_include. as_ref ( ) ,
122+ exclude : next_exclude. as_ref ( ) ,
123+ extra : & field_extra,
124+ } ;
125+ let key = match extra. serialize_by_alias_or ( computed_field. serialize_by_alias ) {
126+ true => computed_field. alias . as_str ( ) ,
127+ false => computed_field. property_name . as_str ( ) ,
128+ } ;
129+ map. serialize_entry ( key, & cfs) ?;
130+ }
131+ }
132+ } else {
133+ for computed_field in & self . 0 {
134+ let property_name_py = computed_field. property_name_py . bind ( model. py ( ) ) ;
135+
136+ if let Some ( ( next_include, next_exclude) ) = filter
137+ . key_filter ( property_name_py, include, exclude)
138+ . map_err ( py_err_se_err) ?
139+ {
140+ let value = model. getattr ( property_name_py) . map_err ( py_err_se_err) ?;
141+ if extra. exclude_none && value. is_none ( ) {
142+ continue ;
143+ }
144+ let field_extra = Extra {
145+ field_name : Some ( computed_field. property_name . as_str ( ) ) ,
146+ ..* extra
147+ } ;
148+ let cfs = ComputedFieldSerializer {
149+ model,
150+ computed_field,
151+ include : next_include. as_ref ( ) ,
152+ exclude : next_exclude. as_ref ( ) ,
153+ extra : & field_extra,
154+ } ;
155+ let key = match extra. serialize_by_alias_or ( computed_field. serialize_by_alias ) {
156+ true => computed_field. alias . as_str ( ) ,
157+ false => computed_field. property_name . as_str ( ) ,
158+ } ;
159+ map. serialize_entry ( key, & cfs) ?;
89160 }
90- let field_extra = Extra {
91- field_name : Some ( computed_field. property_name . as_str ( ) ) ,
92- ..* extra
93- } ;
94- let cfs = ComputedFieldSerializer {
95- model,
96- computed_field,
97- include : next_include. as_ref ( ) ,
98- exclude : next_exclude. as_ref ( ) ,
99- extra : & field_extra,
100- } ;
101- let key = match extra. serialize_by_alias_or ( computed_field. serialize_by_alias ) {
102- true => computed_field. alias . as_str ( ) ,
103- false => computed_field. property_name . as_str ( ) ,
104- } ;
105- map. serialize_entry ( key, & cfs) ?;
106161 }
107162 }
108163 Ok ( ( ) )
0 commit comments