Skip to content

Commit

Permalink
Another fix idea: use default unless given custom argument
Browse files Browse the repository at this point in the history
  • Loading branch information
Rust Saiargaliev committed Mar 10, 2021
1 parent 035281c commit 480e51c
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 16 deletions.
31 changes: 17 additions & 14 deletions model_bakery/baker.py
Original file line number Diff line number Diff line change
Expand Up @@ -351,19 +351,22 @@ def _make(
self.m2m_dict[field.name] = self.model_attrs.pop(field.name)

elif field.name not in self.model_attrs:
# TODO: this might be a code going into a wrong direction, drop it if
# things in `model_bakery.baker.Baker.generate_value` will work out
# if (
# isinstance(field, ForeignKey)
# and "{0}_id".format(field.name) not in self.model_attrs
# ):
# value = self.generate_value(field, commit_related)
# if isinstance(value, field.related_model):
# field_name = field.name
# else:
# field_name = "{0}_id".format(field.name)
#
# self.model_attrs[field_name] = value
#
# elif (
if (
isinstance(field, ForeignKey)
and "{0}_id".format(field.name) not in self.model_attrs
):
value = self.generate_value(field, commit_related)
if isinstance(value, field.related_model):
field_name = field.name
else:
field_name = "{0}_id".format(field.name)

self.model_attrs[field_name] = value

elif (
not isinstance(field, ForeignKey)
or "{0}_id".format(field.name) not in self.model_attrs
):
Expand Down Expand Up @@ -556,8 +559,8 @@ def generate_value(self, field: Field, commit: bool = True) -> Any:
is_content_type_fk = isinstance(field, ForeignKey) and issubclass(
self._remote_field(field).model, contenttypes.models.ContentType
)

if field.has_default():
# when a default provided, we only use it unless the field is listed in `self.rel_fields`
if field.has_default() and field.name not in self.rel_fields:
if callable(field.default):
return field.default()
return field.default
Expand Down
9 changes: 9 additions & 0 deletions tests/generic/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,15 @@ class DummyForeignKeyWithDefaultIdModel(models.Model):
)


class DummyOptionalForeignKey(models.Model):
named_thing = models.ForeignKey(
"NamedThing",
null=True,
default=None,
on_delete=models.SET_NULL,
)


class DummyNullFieldsModel(models.Model):
null_foreign_key = models.ForeignKey(
"DummyBlankFieldsModel", null=True, on_delete=models.CASCADE
Expand Down
18 changes: 16 additions & 2 deletions tests/test_filling_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,10 +279,24 @@ def test_filling_content_type_field(self):
@pytest.mark.django_db
class TestFillingForeignKeyFieldWithDefaultFunctionReturningId:
def test_filling_foreignkey_with_default_id(self):
dummy = baker.make(models.DummyForeignKeyWithDefaultIdModel)
assert dummy.named_thing.id == models.get_default_namedthing_id()
assert dummy.named_thing.name == "Default"

def test_filling_foreignkey_with_default_id_with_custom_arguments(self):
dummy = baker.make(
models.DummyForeignKeyWithDefaultIdModel, named_thing__name="Default"
models.DummyForeignKeyWithDefaultIdModel, named_thing__name="Not default"
)
assert dummy.named_thing.id == models.get_default_namedthing_id()
assert dummy.named_thing.__class__.objects.count() == 1
assert dummy.named_thing.id == 1
assert dummy.named_thing.name == "Not default"


@pytest.mark.django_db
class TestFillingOptionalForeignKeyField:
def test_filling_optional_foreignkey_implicitly(self):
dummy = baker.make(models.DummyOptionalForeignKey, named_thing__name="Optional")
assert dummy.named_thing.name == "Optional"


@pytest.mark.django_db
Expand Down

0 comments on commit 480e51c

Please sign in to comment.