python - factory_boy 中的一对多关系

标签 python sqlalchemy factory-boy

我使用 SQLalchemy 作为我的 ORM,并试图将我的测试装置移植到 factory_boy。我的模式包括一对多关系中的两个对象。 IE。一个模型的实例具有类似列表的结构和另一个模型的实例。示例:

class Person(...):
  id = Column(Integer, primary_key=True)
  name = Column(Text)
  [...]

class Address(...):
  id = Column(Integer, primary_key=True)
  city = Column(Text)
  [...]
  person_id = Column(Integer, ForeignKey('person.id'))
  person = relationship("Person", backref="addresses")

现在我正在尝试创建一个工厂来创建具有几个地址的人。 Factory_boy 有 SubFactory。但我只看到如何在一对一关系中使用它。我知道我可以使用单独的工厂创建地址,然后附加它们,但我想做一些类似 person =PersonFactory.create(num_addresses=4)` 的事情。

有谁知道目前这在 factory_boy 中是否可行?

我使用 factory_boy 2.4.1。

最佳答案

我在我的项目中使用了这个模式。假设您已经有了 AddressFactory

https://factoryboy.readthedocs.io/en/latest/reference.html?highlight=post_generation#factory.post_generation

class PersonFactory(factory.alchemy.SQLAlchemyFactory):
    class Meta:
        model = Person

    @factory.post_generation
    def addresses(obj, create, extracted, **kwargs):
        if not create:
            return

        if extracted:
            assert isinstance(extracted, int)
            AddressFactory.create_batch(size=extracted, person_id=self.id, **kwargs)

用法

PersonFactory(addresses=4)

这将创建具有 4 个 Addresses 的 Person

这也可以接受kwargs

PersonFactory(addresses=2, addresses__city='London')

这将创建具有 2 个 AddressPerson,其中 city 字段设置为 'London'

这是一篇可能对您有所帮助的博文 https://simpleit.rocks/python/django/setting-up-a-factory-for-one-to-many-relationships-in-factoryboy/

关于python - factory_boy 中的一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27120685/

相关文章:

python - 将 Python OR Tools 路由解决方案保存到列表中

python - Django 查询对 ArrayFields 的长度求和

python - 为什么 SQL Server 数据库引擎没有与 SQLAlchemy 引擎连接?

python - 如何在 Cherrypy 和 SQLAlchemy 的同一个请求中使用多个数据库?

django - 如何通过表在工厂男孩中设置动态多对多?

django - DjangoModelFactory 中的日期时间字段破坏了集成测试 (2.1)

python - 失败 : Database access not allowed, 使用 "django_db"标记,或 "db"或 "transactional_db"装置启用它

python - 将列表字典转换为元组字典

python - docker:如何查看我正在使用的驱动程序

python - Postgresql报错语句太大