@statezero/core 0.2.11 → 0.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -283,16 +283,17 @@ function createOperatorFromLookup(field, lookup, value, isRelationship, ModelCla
|
|
|
283
283
|
return { field, operator: { $in: value } };
|
|
284
284
|
}
|
|
285
285
|
else if (lookup === 'gt') {
|
|
286
|
-
|
|
286
|
+
// Exclude null/undefined to match Django (NULL comparisons return no results)
|
|
287
|
+
return { field, operator: { $nin: [null, undefined], $gt: value } };
|
|
287
288
|
}
|
|
288
289
|
else if (lookup === 'gte') {
|
|
289
|
-
return { field, operator: { $gte: value } };
|
|
290
|
+
return { field, operator: { $nin: [null, undefined], $gte: value } };
|
|
290
291
|
}
|
|
291
292
|
else if (lookup === 'lt') {
|
|
292
|
-
return { field, operator: { $lt: value } };
|
|
293
|
+
return { field, operator: { $nin: [null, undefined], $lt: value } };
|
|
293
294
|
}
|
|
294
295
|
else if (lookup === 'lte') {
|
|
295
|
-
return { field, operator: { $lte: value } };
|
|
296
|
+
return { field, operator: { $nin: [null, undefined], $lte: value } };
|
|
296
297
|
}
|
|
297
298
|
else {
|
|
298
299
|
// Default to direct equality if lookup not recognized
|
|
@@ -220,7 +220,30 @@ export class ModelSerializer {
|
|
|
220
220
|
...context,
|
|
221
221
|
});
|
|
222
222
|
}
|
|
223
|
-
//
|
|
223
|
+
// Django-style type coercion for basic types (mimics get_prep_value)
|
|
224
|
+
if (value !== null && value !== undefined) {
|
|
225
|
+
if (fieldType === 'integer') {
|
|
226
|
+
const num = Number(value);
|
|
227
|
+
return Number.isNaN(num) ? value : Math.trunc(num);
|
|
228
|
+
}
|
|
229
|
+
if (fieldType === 'number') {
|
|
230
|
+
const num = Number(value);
|
|
231
|
+
return Number.isNaN(num) ? value : num;
|
|
232
|
+
}
|
|
233
|
+
if (fieldType === 'boolean') {
|
|
234
|
+
if (typeof value === 'string') {
|
|
235
|
+
const lower = value.toLowerCase();
|
|
236
|
+
if (['true', '1', 't', 'yes'].includes(lower))
|
|
237
|
+
return true;
|
|
238
|
+
if (['false', '0', 'f', 'no', ''].includes(lower))
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
return Boolean(value);
|
|
242
|
+
}
|
|
243
|
+
if (fieldType === 'string' && typeof value !== 'string') {
|
|
244
|
+
return String(value);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
224
247
|
return value;
|
|
225
248
|
}
|
|
226
249
|
toLive(data) {
|
package/package.json
CHANGED