Skip to content

Commit

Permalink
Handle ForeignKey.to_field when retrieving default FK instance
Browse files Browse the repository at this point in the history
  • Loading branch information
cb109 committed Dec 9, 2020
1 parent db3ceec commit e486247
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 9 deletions.
10 changes: 8 additions & 2 deletions model_bakery/baker.py
Original file line number Diff line number Diff line change
Expand Up @@ -538,8 +538,14 @@ def generate_value(self, field: Field, commit: bool = True) -> Any:
if callable(default):
default = default()
if is_fk:
# Pass instance instead of pk value
default = remote_field.model.objects.get(pk=default)
# Pass instance instead of pk/<to_field> value. In case a c
# custom to_field is set, Django should populate
# field.to_fields with a single string.
key = "pk"
if field.to_fields and field.to_fields[0] is not None:
key = field.to_fields[0]
instance_kwargs = {key: default}
default = remote_field.model.objects.get(**instance_kwargs)
return default
elif field.name in self.attr_mapping:
generator = self.attr_mapping[field.name]
Expand Down
11 changes: 6 additions & 5 deletions tests/generic/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,18 +255,19 @@ class DummyGenericRelationModel(models.Model):


class NamedThing(models.Model):
name = models.CharField(max_length=64)
name = models.CharField(primary_key=True, max_length=64)


def get_default_namedthing_id():
def get_default_namedthing_name():
instance, _ = NamedThing.objects.get_or_create(name="Default")
return instance.id
return instance.name


class DummyForeignKeyWithDefaultIdModel(models.Model):
named_thing = models.ForeignKey(
"NamedThing",
default=get_default_namedthing_id,
NamedThing,
default=get_default_namedthing_name,
to_field="name",
on_delete=models.SET_DEFAULT,
)

Expand Down
7 changes: 5 additions & 2 deletions tests/test_filling_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,8 +279,11 @@ 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, named_thing__name="Default")
assert dummy.named_thing.id == models.get_default_namedthing_id()
dummy = baker.make(
models.DummyForeignKeyWithDefaultIdModel,
named_thing__name="Default",
)
assert dummy.named_thing.name == models.get_default_namedthing_name()


@pytest.mark.django_db
Expand Down

0 comments on commit e486247

Please sign in to comment.