From 10e53f56d73e2a82287908436eefd064ce3ed6b1 Mon Sep 17 00:00:00 2001 From: Rust Saiargaliev Date: Fri, 16 Aug 2024 15:50:18 +0200 Subject: [PATCH] Fix #492 -- Allow `prepare()` to be used with GFK (#495) --- CHANGELOG.md | 1 + model_bakery/baker.py | 7 +++++-- tests/test_filling_fields.py | 18 ++++++++++++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5ca93c4..5b910c0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed - Align GFK and content type fields generation +- Allow `prepare()` to be used with GFK ### Removed diff --git a/model_bakery/baker.py b/model_bakery/baker.py index b12c0db5..929cc193 100644 --- a/model_bakery/baker.py +++ b/model_bakery/baker.py @@ -526,11 +526,13 @@ def instance( } instance = self.model(**attrs) + + self._handle_generic_foreign_keys(instance, generic_foreign_keys) + if _commit: instance.save(**_save_kwargs) self._handle_one_to_many(instance, one_to_many_keys) self._handle_m2m(instance) - self._handle_generic_foreign_keys(instance, generic_foreign_keys) self._handle_auto_now(instance, auto_now_keys) if _from_manager: @@ -692,13 +694,14 @@ def _handle_m2m(self, instance: Model): def _handle_generic_foreign_keys(self, instance: Model, attrs: Dict[str, Any]): """Set content type and object id for GenericForeignKey fields.""" - for _field_name, data in attrs.items(): + for field_name, data in attrs.items(): content_type_field = data["content_type_field"] object_id_field = data["object_id_field"] value = data["value"] if is_iterator(value): value = next(value) + setattr(instance, field_name, value) setattr( instance, content_type_field, diff --git a/tests/test_filling_fields.py b/tests/test_filling_fields.py index 37c38a56..ed1fb2e7 100644 --- a/tests/test_filling_fields.py +++ b/tests/test_filling_fields.py @@ -287,12 +287,26 @@ def test_filling_content_type_field(self): def test_filling_from_content_object(self): from django.contrib.contenttypes.models import ContentType + profile = baker.make(models.Profile) dummy = baker.make( models.DummyGenericForeignKeyModel, - content_object=baker.make(models.Profile), + content_object=profile, ) + assert dummy.content_object == profile assert dummy.content_type == ContentType.objects.get_for_model(models.Profile) - assert dummy.object_id == models.Profile.objects.get().pk + assert dummy.object_id == profile.pk + + def test_filling_generic_foreign_key_field_with_prepare(self): + from django.contrib.contenttypes.models import ContentType + + profile = baker.prepare(models.Profile, id=1) + dummy = baker.prepare( + models.DummyGenericForeignKeyModel, + content_object=profile, + ) + assert dummy.content_object == profile + assert dummy.content_type == ContentType.objects.get_for_model(models.Profile) + assert dummy.object_id == profile.pk == 1 def test_iteratively_filling_generic_foreign_key_field(self): """