From 3eccd05ecec2d5798dbef96e27add1c0ff53b48a Mon Sep 17 00:00:00 2001 From: EspenAlbert Date: Tue, 24 Nov 2020 08:40:19 +0000 Subject: [PATCH] support updating models on the many side of the one-to-many relations. --- ormar/models/modelproxy.py | 6 ++++++ tests/test_foreign_keys.py | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/ormar/models/modelproxy.py b/ormar/models/modelproxy.py index 3835b41..4d5304b 100644 --- a/ormar/models/modelproxy.py +++ b/ormar/models/modelproxy.py @@ -70,6 +70,12 @@ class ModelTableProxy: f"model without pk set!" ) model_dict[field] = pk_value + elif isinstance(field_value, list): + targets = [target.get(target_pkname) for target in field_value] + if targets: + model_dict[field] = targets + else: + model_dict.pop(field) elif field_value: # nested dict model_dict[field] = field_value.get(target_pkname) else: diff --git a/tests/test_foreign_keys.py b/tests/test_foreign_keys.py index e7bf4e5..0559489 100644 --- a/tests/test_foreign_keys.py +++ b/tests/test_foreign_keys.py @@ -376,3 +376,16 @@ async def test_wrong_model_passed_as_fk(): with pytest.raises(RelationshipInstanceError): org = await Organisation.objects.create(ident="ACME Ltd") await Track.objects.create(album=org, title="Test1", position=1) + + +@pytest.mark.asyncio +async def test_bulk_update_model_with_children(): + async with database: + async with database.transaction(force_rollback=True): + album = await Album.objects.create(name="Test") + track = await Track.objects.create(album=album, title="Test1", position=1) + album.name = "Test2" + await Album.objects.bulk_update([album], columns=["name"]) + + updated_album = await Album.objects.get(id=album.id) + assert updated_album.name == "Test2"