0

我正在使用 Django 2.2 和 FactoryBoy 尝试创建一些工厂来生产以下模型......

class CoopType(models.Model):
    name = models.CharField(max_length=200, null=False)

    objects = CoopTypeManager()

    class Meta:
        # Creates a new unique constraint with the `name` field
        constraints = [models.UniqueConstraint(fields=['name'], name='coop_type_unq')]


class Coop(models.Model):
    objects = CoopManager()
    name = models.CharField(max_length=250, null=False)
    types = models.ManyToManyField(CoopType)
    address = AddressField(on_delete=models.CASCADE)
    enabled = models.BooleanField(default=True, null=False)
    phone = PhoneNumberField(null=True)
    email = models.EmailField(null=True)
    web_site = models.TextField()

这是我创建 Coop 对象的工厂...

class CoopFactory(factory.DjangoModelFactory):
    """
        Define Coop Factory
    """
    class Meta:
        model = Coop

    name = "test model"
    address = factory.SubFactory(AddressFactory)
    enabled = True
    phone = "312-999-1234"
    email = "test@hello.com"
    web_site = "http://www.hello.com"

    @factory.post_generation
    def types(self, create, extracted, **kwargs):
        if not create:
            # Simple build, do nothing.
            return

        if extracted:
            # A list of types were passed in, use them
            for type in extracted:
                self.types.add(type)
        else:
            type = CoopTypeFactory()
            self.types.set( (type) )

这是我的测试...

@pytest.mark.django_db
def test_coop_create(self):
    """ Test customer model """    # create customer model instance
    coop_from_factory = CoopFactory()
    self.assertIsNotNone(coop_from_factory)

    coop = Coop.objects.create(name='test', address=coop_from_factory.address)
    self.assertIsNotNone(coop)

但是,它似乎不喜欢这条线

self.types.set( (type) )

出厂时,因为测试因以下错误而死。让我的工厂在多对多领域工作的正确方法是什么?

    ======================================================================
ERROR: test_coop_create (tests.test_models.ModelTests)
Test customer model
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/davea/Documents/workspace/chicommons/maps/web/tests/test_models.py", line 34, in test_coop_create
    coop_from_factory = CoopFactory()
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/factory/base.py", line 46, in __call__
    return cls.create(**kwargs)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/factory/base.py", line 564, in create
    return cls._generate(enums.CREATE_STRATEGY, kwargs)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/factory/django.py", line 141, in _generate
    return super(DjangoModelFactory, cls)._generate(strategy, params)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/factory/base.py", line 501, in _generate
    return step.build()
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/factory/builder.py", line 299, in build
    context=postgen_context,
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/factory/declarations.py", line 623, in call
    instance, create, context.value, **context.extra)
  File "/Users/davea/Documents/workspace/chicommons/maps/web/tests/factories.py", line 96, in types
    self.types.set( (type) )
  File "/Users/davea/Documents/workspace/chicommons/maps/web/venv/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py", line 1002, in set
    objs = tuple(objs)
TypeError: 'CoopType' object is not iterable
4

0 回答 0