Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
### Added

### Changed
- Fix AttributeError when processing models with reverse ForeignKey relations (`ManyToOneRel`) ([#575](https://github.com/model-bakers/model_bakery/issues/575))
- [dev] Replace mypy with ty as the primary type checker with stricter type checks

### Removed
Expand Down
11 changes: 10 additions & 1 deletion model_bakery/baker.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@
from django.db.models.fields.related import (
ReverseManyToOneDescriptor as ForeignRelatedObjectsDescriptor,
)
from django.db.models.fields.reverse_related import ManyToOneRel, OneToOneRel
from django.db.models.fields.reverse_related import (
ForeignObjectRel,
ManyToOneRel,
OneToOneRel,
)

from . import generators, random_gen
from ._types import M, NewM
Expand Down Expand Up @@ -612,6 +616,11 @@ def _skip_field(self, field: Field) -> bool: # noqa: C901
if isinstance(field, OneToOneField) and self._remote_field(field).parent_link:
return True

# Skip reverse relations (ManyToOneRel, OneToOneRel, ManyToManyRel)
# These are handled separately in create_by_related_name
if isinstance(field, ForeignObjectRel):
return True

other_fields_to_skip = [
AutoField,
OrderWrt,
Expand Down
15 changes: 14 additions & 1 deletion tests/test_baker.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from django.apps import apps
from django.conf import settings
from django.db.models import Manager
from django.db.models import Manager, ManyToOneRel
from django.db.models.signals import m2m_changed
from django.test import TestCase, override_settings

Expand Down Expand Up @@ -1445,3 +1445,16 @@ def test_auto_field_generators_start_from_one(self):

small_values = [random_gen.gen_small_auto_field() for _ in range(100)]
assert all(v >= 1 for v in small_values), "SmallAutoField values should be >= 1"


class TestReverseRelations:
"""Regression tests for issue #575."""

def test_skip_field_skips_reverse_relation_with_fill_optional(self):
reverse_rel = next(
f for f in models.Person._meta.get_fields() if isinstance(f, ManyToOneRel)
)

baker_instance = baker.Baker(models.Person)
baker_instance.fill_in_optional = True
assert baker_instance._skip_field(reverse_rel) is True