Skip to content

Commit 61a0b73

Browse files
committed
Fix sub-model (de)serialization.
1 parent 4c62d62 commit 61a0b73

File tree

3 files changed

+14
-17
lines changed

3 files changed

+14
-17
lines changed

pydanticrud/backends/dynamodb.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -120,18 +120,19 @@ def index_definition(index_name, keys, gsi=False):
120120

121121
class DynamoSerializer:
122122
def __init__(self, schema):
123-
self.schema = schema
123+
self.properties = schema["properties"]
124+
self.definitions = schema.get("definitions")
125+
126+
def _get_type(self, field_name):
127+
if "$ref" in self.properties[field_name]:
128+
def_name = self.properties[field_name]["$ref"].split('/')[-1]
129+
return self.definitions[def_name].get("type")
130+
return self.properties[field_name].get("type", "anyOf")
124131

125132
def _serialize_field(self, field_name, value):
126-
definition = self.schema.get("definitions")
127-
schema = self.schema["properties"]
128-
if definition:
129-
for k, v in definition.items():
130-
schema[k.lower()] = v
131-
schema = self.schema["properties"]
132-
field_type = schema[field_name].get("type", "anyOf")
133+
field_type = self._get_type(field_name)
133134
try:
134-
if any([field_name in self.schema['required'], value is not None]):
135+
if value is not None:
135136
return SERIALIZE_MAP[field_type](value)
136137
except KeyError:
137138
log.debug(f"No serializer for field_type {field_type}")
@@ -147,14 +148,9 @@ def serialize_record(self, data_dict) -> dict:
147148
}
148149

149150
def _deserialize_field(self, field_name, value):
150-
definition = self.schema.get("definitions")
151-
schema = self.schema["properties"]
152-
if definition:
153-
for k, v in definition.items():
154-
schema[k.lower()] = v
155-
field_type = schema[field_name].get("type", "anyOf")
151+
field_type = self._get_type(field_name)
156152
try:
157-
if any([field_name in self.schema['required'], value is not None]):
153+
if value is not None:
158154
return DESERIALIZE_MAP[field_type](value)
159155
except KeyError:
160156
log.debug(f"No deserializer for field_type {field_type}")

pydanticrud/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pydantic.error_wrappers
12
from pydantic import BaseModel as PydanticBaseModel
23
from pydantic.main import ModelMetaclass
34
from rule_engine import Rule

tests/test_dynamodb.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -461,9 +461,9 @@ def test_query_scan_complex(dynamo, complex_query_data):
461461
def test_query_with_nested_model(dynamo, nested_query_data):
462462
res = NestedModel.query()
463463
for m in res:
464+
assert isinstance(m.ticket, Ticket)
464465
assert m.ticket.created_time is not None
465466
assert m.ticket.number is not None
466-
assert type(m.ticket) is Ticket
467467

468468

469469
def test_query_with_nested_model_optional(dynamo, nested_query_data_empty_ticket):

0 commit comments

Comments
 (0)