@@ -52,12 +52,29 @@ impl ComputedFields {
52
52
// Do not serialize computed fields
53
53
return Ok ( ( ) ) ;
54
54
}
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
+ }
61
78
}
62
79
Ok ( ( ) )
63
80
}
@@ -76,33 +93,71 @@ impl ComputedFields {
76
93
return Ok ( ( ) ) ;
77
94
}
78
95
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 ( ) ) ;
81
105
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) ?;
89
160
}
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) ?;
106
161
}
107
162
}
108
163
Ok ( ( ) )
0 commit comments