diff --git a/ormar/models/modelproxy.py b/ormar/models/modelproxy.py index af98d74..2ea7ac3 100644 --- a/ormar/models/modelproxy.py +++ b/ormar/models/modelproxy.py @@ -70,14 +70,15 @@ 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 + elif field_value: # nested dict + if isinstance(field_value, list): + model_dict[field] = [ + target.get(target_pkname) for target in field_value + ] else: - model_dict.pop(field) - else: # nested dict - model_dict[field] = field_value.get(target_pkname) + model_dict[field] = field_value.get(target_pkname) + else: + model_dict.pop(field) return model_dict @classmethod diff --git a/tests/test_foreign_keys.py b/tests/test_foreign_keys.py index 09e3e82..4dafef7 100644 --- a/tests/test_foreign_keys.py +++ b/tests/test_foreign_keys.py @@ -20,6 +20,7 @@ class Album(ormar.Model): id: int = ormar.Integer(primary_key=True) name: str = ormar.String(max_length=100) + is_best_seller: bool = ormar.Boolean(default=False) class Track(ormar.Model): @@ -32,6 +33,7 @@ class Track(ormar.Model): album: Optional[Album] = ormar.ForeignKey(Album) title: str = ormar.String(max_length=100) position: int = ormar.Integer() + play_count: int = ormar.Integer(nullable=True, default=0) class Cover(ormar.Model): @@ -394,14 +396,34 @@ async def test_bulk_update_model_with_no_children(): 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(title="Test1", position=1) - album.tracks = [track] - album.name = "Test2" - await Album.objects.bulk_update([album], columns=["name"]) - - updated_album = await Album.objects.select_related("tracks").get( - id=album.id + best_seller = await Album.objects.create(name="to_be_best_seller") + best_seller2 = await Album.objects.create(name="to_be_best_seller2") + not_best_seller = await Album.objects.create(name="unpopular") + await Track.objects.create( + album=best_seller, title="t1", position=1, play_count=100 ) - assert updated_album.name == "Test2" - assert len(updated_album.tracks) == 0 + await Track.objects.create( + album=best_seller2, title="t2", position=1, play_count=100 + ) + await Track.objects.create( + album=not_best_seller, title="t3", position=1, play_count=3 + ) + await Track.objects.create( + album=best_seller, title="t4", position=1, play_count=500 + ) + + tracks = await Track.objects.select_related("album").filter( + play_count__gt=10 + ).all() + best_seller_albums = {} + for track in tracks: + album = track.album + if album.id in best_seller_albums: + continue + album.is_best_seller = True + best_seller_albums[album.id] = album + await Album.objects.bulk_update( + best_seller_albums.values(), columns=["is_best_seller"] + ) + best_seller_albums_db = await Album.objects.filter(is_best_seller=True).all() + assert len(best_seller_albums_db) == 2