From 8cee9ce009a0cb85ecf038c694e8eb33ebf53123 Mon Sep 17 00:00:00 2001 From: slorello89 Date: Tue, 7 May 2024 14:12:07 -0400 Subject: [PATCH 1/2] fixing None types in hashes --- aredis_om/model/model.py | 3 +++ tests/test_hash_model.py | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/aredis_om/model/model.py b/aredis_om/model/model.py index 56c5c90..e436009 100644 --- a/aredis_om/model/model.py +++ b/aredis_om/model/model.py @@ -1680,6 +1680,9 @@ async def save( self.check() db = self._get_db(pipeline) document = jsonable_encoder(self.dict()) + + # filter out values which are `None` because they are not valid in a HSET + document = {k: v for k, v in document.items() if v is not None} # TODO: Wrap any Redis response errors in a custom exception? await db.hset(self.key(), mapping=document) return self diff --git a/tests/test_hash_model.py b/tests/test_hash_model.py index 185005f..e06e8ea 100644 --- a/tests/test_hash_model.py +++ b/tests/test_hash_model.py @@ -875,3 +875,24 @@ async def test_xfix_queries(members, m): result = await m.Member.find(m.Member.bio % "*eat*").first() assert result.first_name == "Andrew" + + +@py_test_mark_asyncio +async def test_none(): + class ModelWithNoneDefault(HashModel): + test: Optional[str] = Field(index=True, default=None) + + class ModelWithStringDefault(HashModel): + test: Optional[str] = Field(index=True, default='None') + + await Migrator().run() + + a = ModelWithNoneDefault(test=None) + await a.save() + res = await ModelWithNoneDefault.find(ModelWithNoneDefault.pk == a.pk).first() + assert res.test is None + + b = ModelWithStringDefault(test=None) + await b.save() + res = await ModelWithStringDefault.find(ModelWithStringDefault.pk == b.pk).first() + assert res.test == 'None' From 6f716f6cda48c415a44aa2fc8fdccf730d8c4a9e Mon Sep 17 00:00:00 2001 From: slorello89 Date: Tue, 7 May 2024 14:35:26 -0400 Subject: [PATCH 2/2] adding JSON test to check consistent behavior, using true defaults --- tests/test_hash_model.py | 8 ++++---- tests/test_json_model.py | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/tests/test_hash_model.py b/tests/test_hash_model.py index e06e8ea..c7dc025 100644 --- a/tests/test_hash_model.py +++ b/tests/test_hash_model.py @@ -883,16 +883,16 @@ class ModelWithNoneDefault(HashModel): test: Optional[str] = Field(index=True, default=None) class ModelWithStringDefault(HashModel): - test: Optional[str] = Field(index=True, default='None') + test: Optional[str] = Field(index=True, default="None") await Migrator().run() - a = ModelWithNoneDefault(test=None) + a = ModelWithNoneDefault() await a.save() res = await ModelWithNoneDefault.find(ModelWithNoneDefault.pk == a.pk).first() assert res.test is None - b = ModelWithStringDefault(test=None) + b = ModelWithStringDefault() await b.save() res = await ModelWithStringDefault.find(ModelWithStringDefault.pk == b.pk).first() - assert res.test == 'None' + assert res.test == "None" diff --git a/tests/test_json_model.py b/tests/test_json_model.py index d574485..217d495 100644 --- a/tests/test_json_model.py +++ b/tests/test_json_model.py @@ -971,3 +971,24 @@ async def test_xfix_queries(m): result = await m.Member.find(m.Member.bio % "*ack*").first() assert result.first_name == "Steve" + + +@py_test_mark_asyncio +async def test_none(): + class ModelWithNoneDefault(JsonModel): + test: Optional[str] = Field(index=True, default=None) + + class ModelWithStringDefault(JsonModel): + test: Optional[str] = Field(index=True, default="None") + + await Migrator().run() + + a = ModelWithNoneDefault() + await a.save() + res = await ModelWithNoneDefault.find(ModelWithNoneDefault.pk == a.pk).first() + assert res.test is None + + b = ModelWithStringDefault() + await b.save() + res = await ModelWithStringDefault.find(ModelWithStringDefault.pk == b.pk).first() + assert res.test == "None"