Skip to content
This repository has been archived by the owner on Oct 22, 2019. It is now read-only.

Commit

Permalink
Add field lookup by related name
Browse files Browse the repository at this point in the history
  • Loading branch information
berinhard committed Nov 17, 2016
1 parent ecf6393 commit c5fd18a
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 1 deletion.
19 changes: 18 additions & 1 deletion model_mommy/mommy.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,9 @@ def prepare(self, _save_related=False, **attrs):
def get_fields(self):
return self.model._meta.fields + self.model._meta.many_to_many

def get_related(self):
return [r for r in self.model._meta.related_objects if not r.many_to_many]

def _make(self, commit=True, commit_related=True, _save_kwargs=None, **attrs):
_save_kwargs = _save_kwargs or {}

Expand All @@ -265,7 +268,11 @@ def _make(self, commit=True, commit_related=True, _save_kwargs=None, **attrs):
except StopIteration:
raise RecipeIteratorEmpty('{0} iterator is empty.'.format(field.name))

return self.instance(self.model_attrs, _commit=commit, _save_kwargs=_save_kwargs)
instance = self.instance(self.model_attrs, _commit=commit, _save_kwargs=_save_kwargs)
for related in self.get_related():
self.create_by_related_name(instance, related)

return instance

def m2m_value(self, field):
if field.name in self.rel_fields:
Expand All @@ -289,6 +296,16 @@ def instance(self, attrs, _commit, _save_kwargs):
self._handle_m2m(instance)
return instance

def create_by_related_name(self, instance, related):
if related.name not in self.rel_fields:
return

kwargs = filter_rel_attrs(related.name, **self.rel_attrs)
kwargs[related.field.name] = instance
kwargs['model'] = related.field.model

make(**kwargs)

def _clean_attrs(self, attrs):
self.fill_in_optional = attrs.pop('_fill_optional', False)
is_rel_field = lambda x: '__' in x
Expand Down
6 changes: 6 additions & 0 deletions test/generic/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,12 @@ class LonelyPerson(models.Model):
only_friend = models.OneToOneField(Person)


class RelatedNamesModel(models.Model):
name = models.CharField(max_length=256)
one_to_one = models.OneToOneField(Person, related_name='one_related')
foreign_key = models.ForeignKey(Person, related_name='fk_related')


class ModelWithOverridedSave(Dog):

def save(self, *args, **kwargs):
Expand Down
13 changes: 13 additions & 0 deletions test/generic/tests/test_mommy.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,19 @@ def test_allow_create_fkey_related_model(self):

self.assertEqual(person.dog_set.count(), 2)

def test_field_lookup_for_related_field(self):
person = mommy.make(
models.Person,
one_related__name='Foo',
fk_related__name='Bar',
)

self.assertTrue(person.pk)
self.assertTrue(person.one_related.pk)
self.assertTrue(1, person.fk_related.count())
self.assertEqual('Foo', person.one_related.name)
self.assertEqual('Bar', person.fk_related.get().name)


class HandlingUnsupportedModels(TestCase):
def test_unsupported_model_raises_an_explanatory_exception(self):
Expand Down

0 comments on commit c5fd18a

Please sign in to comment.