model-bakers / model_bakery

Object factory for Django
https://model-bakery.readthedocs.io/en/latest/
Other
846 stars 85 forks source link

`baker.make()` with `_bulk_create=True` doesn't create m2m entries on foreign-key related objects #490

Open richardebeling opened 3 months ago

richardebeling commented 3 months ago

Follow-Up to https://github.com/model-bakers/model_bakery/issues/385, which was fixed in https://github.com/model-bakers/model_bakery/pull/486. When specifying values for a M2M field inside an object that is itself accessed via a foreign key, baker doesn't create m2m entries when called with _bulk_create=True.

Inside the test suite, with the additional model definition (so we can have a model with a foreign key field to a model with a m2m field -- none of the existing models currently fulfills this condition)

class HomeOwner(models.Model):
    home = models.ForeignKey(Home, on_delete=models.CASCADE)

put this test in class TestCreateM2MWhenBulkCreate:

def test_create_through_foreign_key_field(self):
    dog = baker.make(models.Dog)
    baker.make(models.HomeOwner, home__dogs=[dog], _quantity=10, _bulk_create=True)

    h1, h2 = models.HomeOwner.objects.all()[:2]
    assert list(h1.home.dogs.all()) == list(h2.home.dogs.all()) == [dog]

It fails with the error:

______ TestCreateM2MWhenBulkCreate.test_create_through_foreign_key_field ______
tests/test_baker.py:1101: in test_create_through_foreign_key_field
    assert list(h1.home.dogs.all()) == list(h2.home.dogs.all()) == [dog]
E   assert [] == [<Dog: Dog object (1)>]
E     
E     Right contains one more item: <Dog: Dog object (1)>
E     
E     Full diff:
E     + []
E     - [
E     -     <Dog: Dog object (1)>,
E     - ]

Versions