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