model_bakery icon indicating copy to clipboard operation
model_bakery copied to clipboard

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

Open richardebeling opened this issue 1 year ago • 0 comments

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

  • Python: 3.10.12
  • Django: 4.2
  • Model Bakery 1.19.1 (tested at d758c7ae5a5f4a41588f96fc2562d1ae91d3e062)

richardebeling avatar Aug 12 '24 20:08 richardebeling