diff --git a/CHANGELOG.md b/CHANGELOG.md index ac01817f..0d3fdb30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased](https://github.com/model-bakers/model_bakery/tree/main) ### Added + ### Changed +- Fixed a bug with overwritten `_save_kwargs` and other custom arguments [PR #330](https://github.com/model-bakers/model_bakery/pull/330) + ### Removed ## [1.6.0](https://pypi.org/project/model-bakery/1.6.0/) diff --git a/model_bakery/recipe.py b/model_bakery/recipe.py index 93f7ee28..401c312f 100644 --- a/model_bakery/recipe.py +++ b/model_bakery/recipe.py @@ -111,22 +111,28 @@ def make( def make( self, _quantity: Optional[int] = None, - make_m2m: bool = False, - _refresh_after_create: bool = False, - _create_files: bool = False, + make_m2m: Optional[bool] = None, + _refresh_after_create: Optional[bool] = None, + _create_files: Optional[bool] = None, _using: str = "", - _bulk_create: bool = False, + _bulk_create: Optional[bool] = None, _save_kwargs: Optional[Dict[str, Any]] = None, **attrs: Any, ) -> Union[M, List[M]]: - defaults = { - "_quantity": _quantity, - "make_m2m": make_m2m, - "_refresh_after_create": _refresh_after_create, - "_create_files": _create_files, - "_bulk_create": _bulk_create, - "_save_kwargs": _save_kwargs, - } + defaults = {} + if _quantity is not None: + defaults["_quantity"] = _quantity + if make_m2m is not None: + defaults["make_m2m"] = make_m2m + if _refresh_after_create is not None: + defaults["_refresh_after_create"] = _refresh_after_create + if _create_files is not None: + defaults["_create_files"] = _create_files + if _bulk_create is not None: + defaults["_bulk_create"] = _bulk_create + if _save_kwargs is not None: + defaults["_save_kwargs"] = _save_kwargs # type: ignore[assignment] + defaults.update(attrs) return baker.make(self._model, _using=_using, **self._mapping(_using, defaults)) diff --git a/tests/generic/baker_recipes.py b/tests/generic/baker_recipes.py index f4e27c7a..e2dd7154 100644 --- a/tests/generic/baker_recipes.py +++ b/tests/generic/baker_recipes.py @@ -113,6 +113,10 @@ class SmallDogRecipe(Recipe): overrided_save = Recipe("generic.ModelWithOverridedSave") +with_save_kwargs = Recipe( + "generic.ModelWithSaveKwargs", _save_kwargs={"breed": "updated_breed"} +) + ip_fields = Recipe( "generic.DummyGenericIPAddressFieldModel", ipv4_field=seq("127.0.0.", increment_by=2), diff --git a/tests/generic/models.py b/tests/generic/models.py index 0acf2145..0fefe025 100755 --- a/tests/generic/models.py +++ b/tests/generic/models.py @@ -223,7 +223,13 @@ class RelatedNamesWithEmptyDefaultsModel(models.Model): class ModelWithOverridedSave(Dog): def save(self, *args, **kwargs): self.owner = kwargs.pop("owner") - return super(ModelWithOverridedSave, self).save(*args, **kwargs) + return super().save(*args, **kwargs) + + +class ModelWithSaveKwargs(Dog): + def save(self, *args, **kwargs): + self.breed = kwargs.pop("breed") + return super().save(*args, **kwargs) class Classroom(models.Model): diff --git a/tests/test_recipes.py b/tests/test_recipes.py index 45d8780a..ab5163c4 100644 --- a/tests/test_recipes.py +++ b/tests/test_recipes.py @@ -332,6 +332,10 @@ def test_pass_save_kwargs(self): ) assert owner == dog.owner + def test_pass_save_kwargs_in_recipe_definition(self): + dog = baker.make_recipe("tests.generic.with_save_kwargs") + assert dog.breed == "updated_breed" + def test_ip_fields_with_start(self): first, second = baker.make_recipe("tests.generic.ip_fields", _quantity=2)