|
4 | 4 | from pyrestorm.client import RestClient |
5 | 5 | from pyrestorm.fields import Field, RelatedField |
6 | 6 | from pyrestorm.exceptions import orm as orm_exceptions |
| 7 | +from pyrestorm.query import RestQueryset |
7 | 8 | from pyrestorm.manager import RestOrmManager |
8 | 9 |
|
9 | 10 | primitives = [int, str, unicode, bool, type(None)] |
@@ -178,36 +179,39 @@ def _serialize_data(self, obj, ref): |
178 | 179 | if key.startswith('_') or self._get_reference_data(ref, key) == value: |
179 | 180 | continue |
180 | 181 |
|
| 182 | + # Check if the value can be cleaned |
| 183 | + cleaned_value = value |
| 184 | + |
| 185 | + # Serializing of a `RestQueryset` is currently unsuppored since there |
| 186 | + # is no public way to create one without querying, which means the data |
| 187 | + # already exists on the server. |
| 188 | + if isinstance(value, RestQueryset): |
| 189 | + return local_diff |
| 190 | + |
181 | 191 | # Determine what type the current `value` is to process one of the three cases |
182 | 192 | value_type = type(value) |
183 | 193 |
|
184 | 194 | # 1. Primitives |
185 | 195 | if value_type in primitives: |
186 | | - cleaned_value = value |
187 | | - # Checks if we need to prepare the data |
188 | | - if key in getattr(getattr(value, '_meta', None), 'fields', {}): |
189 | | - cleaned_value = value._meta.fields[key].clean(value) |
190 | | - |
191 | 196 | # If the value of the field is not what we've seen before, add it to the diff |
192 | | - if ref != value: |
| 197 | + if ref != cleaned_value: |
193 | 198 | local_diff[key] = cleaned_value |
194 | | - |
195 | 199 | # 2/3. Objects |
196 | 200 | else: |
197 | 201 | # 2. Lists |
198 | 202 | if value_type == list: |
199 | 203 | # Process each idex of the `list` |
200 | 204 | local_diff[key] = [] |
201 | | - for idx, inner_value in enumerate(value): |
| 205 | + for idx, inner_value in enumerate(cleaned_value): |
202 | 206 | if type(inner_value) in primitives: |
203 | 207 | local_diff[key].append(inner_value) |
204 | 208 | else: |
205 | 209 | local_diff[key].append(self._serialize_data(inner_value, self._get_reference_data(ref, idx))) |
206 | 210 | # 3. Object/Dictionary |
207 | 211 | else: |
208 | 212 | new_ref = self._get_reference_data(ref, key) |
209 | | - _data = self._serialize_data(value, new_ref) |
210 | | - if not _data and type(value) not in (primitives + non_object_types): |
| 213 | + _data = self._serialize_data(cleaned_value, new_ref) |
| 214 | + if not _data and value_type not in (primitives + non_object_types): |
211 | 215 | continue |
212 | 216 | local_diff[key] = _data |
213 | 217 |
|
|
0 commit comments