From 0b4625ac39bc3204f0987efce0f0c0c25e829a68 Mon Sep 17 00:00:00 2001 From: Ashia Date: Sun, 24 Oct 2021 16:05:02 -0600 Subject: [PATCH 1/3] Allow relation _id fields to use a sequence --- model_bakery/baker.py | 20 +++++++++++++++++++- tests/test_recipes.py | 25 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/model_bakery/baker.py b/model_bakery/baker.py index 9cc1b9a4..a7dcdcd0 100644 --- a/model_bakery/baker.py +++ b/model_bakery/baker.py @@ -363,10 +363,20 @@ def _make( ] else: self.m2m_dict[field.name] = self.model_attrs.pop(field.name) + # is an _id relation that has a sequence defined + elif ( + (isinstance(field, OneToOneField) or isinstance(field, ForeignKey)) + and hasattr(field, "attname") + and field.attname in self.iterator_attrs + ): + self.model_attrs[field.attname] = next( + self.iterator_attrs[field.attname] + ) elif field.name not in self.model_attrs: if ( not isinstance(field, ForeignKey) - or "{0}_id".format(field.name) not in self.model_attrs + or hasattr(field, "attname") + and field.attname not in self.model_attrs ): self.model_attrs[field.name] = self.generate_value( field, commit_related @@ -476,6 +486,14 @@ def _skip_field(self, field: Field) -> bool: if isinstance(field, FileField) and not self.create_files: return True + # Don't Skip related _id fields defined in the iterator attributes + if ( + (isinstance(field, OneToOneField) or isinstance(field, ForeignKey)) + and hasattr(field, "attname") + and field.attname in self.iterator_attrs + ): + return False + # Skip links to parent so parent is not created twice. if isinstance(field, OneToOneField) and self._remote_field(field).parent_link: return True diff --git a/tests/test_recipes.py b/tests/test_recipes.py index 817c135d..8141401f 100644 --- a/tests/test_recipes.py +++ b/tests/test_recipes.py @@ -17,7 +17,10 @@ Dog, DummyBlankFieldsModel, DummyNumbersModel, + LonelyPerson, Person, + Profile, + User, ) recipe_attrs = { @@ -32,6 +35,8 @@ "birth_time": now(), } person_recipe = Recipe(Person, **recipe_attrs) +user_recipe = Recipe(User) +lonely_person_recipe = Recipe(LonelyPerson) def test_import_seq_from_recipe(): @@ -450,6 +455,26 @@ def test_increment_for_strings_with_suffix(self): person = fred_person.make() assert person.email == "fred3@example.com" + def test_increment_for_fks(self): + from model_bakery.recipe import seq # NoQA + + baker.make(Profile, _quantity=3) + seq_user = user_recipe.extend(username="name", profile_id=seq(1)) + user = seq_user.make() + assert user.profile_id == 2 + user = seq_user.make() + assert user.profile_id == 3 + + def test_increment_for_one_to_one(self): + from model_bakery.recipe import seq # NoQA + + baker.make(Person, _quantity=3) + seq_lonely_person = lonely_person_recipe.extend(only_friend_id=seq(1)) + person = seq_lonely_person.make() + assert person.only_friend_id == 2 + user = seq_lonely_person.make() + assert user.only_friend_id == 3 + def test_increment_for_strings_with_bad_suffix(self): from model_bakery.recipe import seq # NoQA From 7543a3c4e69ec6a2458d201b7484e4ebe30abdf4 Mon Sep 17 00:00:00 2001 From: Ashia Date: Wed, 27 Oct 2021 23:45:11 -0600 Subject: [PATCH 2/3] Make the test more robust by not using hardcoded PK --- tests/test_recipes.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tests/test_recipes.py b/tests/test_recipes.py index 8141401f..74c8037a 100644 --- a/tests/test_recipes.py +++ b/tests/test_recipes.py @@ -458,22 +458,24 @@ def test_increment_for_strings_with_suffix(self): def test_increment_for_fks(self): from model_bakery.recipe import seq # NoQA - baker.make(Profile, _quantity=3) - seq_user = user_recipe.extend(username="name", profile_id=seq(1)) + profiles = baker.make(Profile, _quantity=3) + start_id = profiles[0].id + seq_user = user_recipe.extend(username="name", profile_id=seq(start_id)) user = seq_user.make() - assert user.profile_id == 2 + assert user.profile_id == start_id + 1 user = seq_user.make() - assert user.profile_id == 3 + assert user.profile_id == start_id + 2 def test_increment_for_one_to_one(self): from model_bakery.recipe import seq # NoQA - baker.make(Person, _quantity=3) - seq_lonely_person = lonely_person_recipe.extend(only_friend_id=seq(1)) + people = baker.make(Person, _quantity=3) + start_id = people[0].id + seq_lonely_person = lonely_person_recipe.extend(only_friend_id=seq(start_id)) person = seq_lonely_person.make() - assert person.only_friend_id == 2 + assert person.only_friend_id == start_id + 1 user = seq_lonely_person.make() - assert user.only_friend_id == 3 + assert user.only_friend_id == start_id + 2 def test_increment_for_strings_with_bad_suffix(self): from model_bakery.recipe import seq # NoQA From 0a3cb72996c194d42f3fa562f3c96444848e860d Mon Sep 17 00:00:00 2001 From: Ashia Date: Wed, 27 Oct 2021 23:47:27 -0600 Subject: [PATCH 3/3] Add changelog message --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dc90cf1..d228886d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed - Fix a simple typo in `bulk_create` disclaimer in docs +- Allow relation `_id` fields to use sequences [PR #253](https://github.com/model-bakers/model_bakery/pull/253/) ### Removed