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,)需要有一个逗号。

ManyToMany是关系型数据库中的一种关联关系,它表示两个实体类之间的多对多关系。通过中间表来存储两个实体类之间的关联关系。 在使用ManyToMany关系时,我们可以通过两种参数来进一步配置关系。第一个参数是through参数,它指定了中间表的名称。通过这个参数,我们可以自定义中间表的名称和字段。第二个参数是through_fields参数,它指定了中间表中哪些字段用来表示两个实体类的关系。 例如,在Django中,我们可以使用@ManyToMany注解来定义ManyToMany关系。被控方的代码示例如下:@ManyToMany(fetch = FetchType.LAZY, mappedBy = "students") public Set<Teacher> getTeachers() { return teachers; } 通过使用@ManyToMany注解,我们可以指定fetch参数来定义关联关系的加载策略,以及通过mappedBy参数来指定关联关系的所有者方。 总之,ManyToMany关系是一种常见的关联关系,它可以用于表示两个实体类之间的多对多关系。通过配置through和through_fields参数,我们可以自定义中间表的名称和字段,从而更好地管理ManyToMany关系。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Django笔记七之ManyToMany和OneToOne介绍](https://blog.csdn.net/weixin_43354181/article/details/122897334)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [(转)ManyToMany注解](https://blog.csdn.net/u012102536/article/details/88995200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [基于django ManyToMany 使用的注意事项详解](https://download.csdn.net/download/weixin_38599545/12860677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈大憨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值