factory-boy创建manytomany伪数据

1.安装factory-boy库:

pip install factory-boy

本案例使用的是基于Django的ORM。
新建两个model:
Shipment:

class Shipment(AbstractCommodityList, DateSlugMixin, DateListMixin, TrackingMixin):
    slug = models.CharField(_('Shipment #'), max_length=255, blank=True, null=True, db_index=True)
    tracking_num = models.CharField(max_length=255, blank=True, null=True, db_index=True)
    po_num = models.CharField(max_length=255, blank=True, null=True, db_index=True)
    order = models.ForeignKey('app.Order', blank=True, null=True)
    status = models.CharField(max_length=255, default='Draft', choices=settings.CFG['SHIPMENT_STATUS'])
    shipped_date = models.DateField(db_index=True, null=True, blank=True)
    carrier = models.CharField(max_length=255, default='FedEx', choices=settings.CFG['CARRIER'])

    email_dates = models.TextField(blank=True, null=True, default='[]')

    ship_to_dealer = models.BooleanField(default=False)

    # 用于标记订单发货的程度,All为默认全部发货,Partial为部分发货,Final为最终发货
    extent = models.CharField(max_length=255, default='All', choices=settings.CFG['SHIPMENT_EXTENT'])

    class Meta:
        ordering = ['-id']
        db_table = 'app_biz_shipment'
        default_permissions = ('add', 'change', 'delete', 'view')

ShipmentGroup:

class ShipmentGroup(AbstractGroupModel, DateSlugMixin, TrackingMixin):
    shipment = models.ManyToManyField('app.Shipment')
    carrier = models.CharField(max_length=255, default='FedEx', choices=settings.CFG['CARRIER'])
    tracking_num = models.CharField(max_length=255, blank=True, null=True, db_index=True)
    status = models.CharField(max_length=255, default='Draft', choices=settings.CFG['SHIPMENT_STATUS'])
    shipped_date = models.DateField(db_index=True, null=True, blank=True)

ShipmentGroup中的shipment属性是manytomany的关系。

先写对应的Factory:

class ShipmentFactory(AbstractContractFactory):
    class Meta:
        model = "app.Shipment"

    slug = factory.Faker("pystr")
    order = factory.SubFactory('app.factory.biz.order.OrderFactory')
    status = factory.Faker('random_element', elements=tuple(i[0] for i in base_settings.CFG['SHIPMENT_STATUS']))
    carrier = factory.Faker('random_element', elements=tuple(i[0] for i in base_settings.CFG['CARRIER']))
    email_dates = []
    ship_to_dealer = False
    extent = factory.Faker('random_element', elements=tuple(i[0] for i in base_settings.CFG['SHIPMENT_EXTENT']))
class ShipmentGroupFactory(AbstractContractFactory):
    class Meta:
        model = "app.ShipmentGroup"

    # shipment = factory.SubFactory('app.factory.biz.shipment.ShipmentFactory')
    carrier = factory.Faker('random_element', elements=tuple(i[0] for i in base_settings.CFG['CARRIER']))
    status = factory.Faker('random_element', elements=tuple(i[0] for i in base_settings.CFG['SHIPMENT_STATUS']))

    # 当model中出现manytomany的属性的时候,factory官方建议使用下面的代码
    # 官方例子:https://factoryboy.readthedocs.io/en/latest/recipes.html#simple-many-to-many-relationship
    @factory.post_generation
    def shipment(self, create, extracted, **kwargs):
        if not create:
            # Simple build, do nothing.
            return

        if extracted:
            # A list of groups were passed in, use them
            for shipment in extracted:
                self.shipment.add(shipment)

下面就是使用factory生成伪数据:

shipment = ShipmentFactory.create()
shipment_group = ShipmentGroupFactory.create(shipment=(shipment,))

注意的是如果shipment只有一个,那么(shipment,)需要有一个逗号。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈大憨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值