diff --git a/CHANGELOG.md b/CHANGELOG.md index 287d14ab..2d8eb59b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Added ### Changed +- Fix support of `auto_now` and `auto_now_add` fields in combination with `_fill_optional` ### Removed diff --git a/model_bakery/baker.py b/model_bakery/baker.py index 07d4ee2c..d0f5a0e5 100644 --- a/model_bakery/baker.py +++ b/model_bakery/baker.py @@ -70,6 +70,10 @@ def _valid_quantity(quantity: Optional[Union[str, int]]) -> bool: return quantity is not None and (not isinstance(quantity, int) or quantity < 1) +def _is_auto_datetime_field(field: Field) -> bool: + return getattr(field, "auto_now_add", False) or getattr(field, "auto_now", False) + + def seed(seed: Union[int, float, str, bytes, bytearray, None]) -> None: Baker.seed(seed) @@ -513,10 +517,7 @@ def instance( if isinstance(field, ForeignRelatedObjectsDescriptor): one_to_many_keys[k] = attrs.pop(k) - if hasattr(field, "field") and ( - getattr(field.field, "auto_now_add", False) - or getattr(field.field, "auto_now", False) - ): + if hasattr(field, "field") and _is_auto_datetime_field(field.field): auto_now_keys[k] = attrs[k] if BAKER_CONTENTTYPES and isinstance(field, GenericForeignKey): @@ -589,6 +590,9 @@ def _skip_field(self, field: Field) -> bool: # noqa: C901 else: field.fill_optional = field.name in self.fill_in_optional + if _is_auto_datetime_field(field): + return True + if isinstance(field, FileField) and not self.create_files: return True diff --git a/tests/test_baker.py b/tests/test_baker.py index 46c26c44..835c91c5 100644 --- a/tests/test_baker.py +++ b/tests/test_baker.py @@ -1124,3 +1124,16 @@ def test_make_with_auto_now(self, use_tz, settings): assert instance.created == now assert instance.updated == now assert instance.sent_date == now + + @pytest.mark.django_db + def test_make_with_auto_now_and_fill_optional(self): + instance = baker.make( + models.ModelWithAutoNowFields, + _fill_optional=True, + ) + created, updated = instance.created, instance.updated + + instance.refresh_from_db() + + assert instance.created == created + assert instance.updated == updated