无法针对 ManyToManyField 填充虚拟数据
Cannot populate dummy data against ManyToManyField
我正在尝试使用 factoryboy 在我的项目中为 Django 模型创建测试数据。数据是通过 Faker
生成的,除了一个字段,即 ManyToManyField
;与来自 django.contrib.auth.model
命名组的另一个内置模型的多对多关系。
class Voucher(models.Model):
code = models.CharField(max_length=20, null=True, blank=True, unique=True)
is_enabled = models.BooleanField('enable voucher', default=True, help_text='A soft delete mechanism for the voucher.')
start_date = models.DateTimeField(null=True, blank=True)
end_date = models.DateTimeField(null=True, blank=True)
member_roles = models.ManyToManyField(to=Group, related_name='member_roles')
def __str__(self):
return "{}".format(self.code)
class Meta:
verbose_name = 'Voucher'
verbose_name_plural = 'Vouchers'
这是我的模型,这是我创建的用于生成虚拟数据的工厂:
class VoucherFactory(django.DjangoModelFactory):
class Meta:
model = 'app.Voucher'
code = Faker('first_name')
is_enabled = fuzzy.FuzzyChoice([True, False])
start_date = fuzzy.FuzzyDateTime(datetime.datetime.now(pytz.utc))
end_date = fuzzy.FuzzyDateTime(datetime.datetime.now(pytz.utc))
@factory.post_generation
def member_roles(self, create, extracted, **kwargs):
if not create:
return
if extracted:
for member_role in extracted:
self.member_roles.add(member_role)
除了 voucher_member_roles
table 根据 Voucher
模型中的多对多关系创建的数据外,数据已成功填充。我希望这个 table 也被填充。
我错过了什么?
制作凭证工厂时需要传入member_roles。例如:
VoucherFactory.create(member_roles=[member_role1, member_role2])
请参阅 http://factoryboy.readthedocs.io/en/latest/recipes.html#simple-many-to-many-relationship 其中指出:
调用 UserFactory() 或 UserFactory.build() 时,不会创建组绑定。
但是当调用 UserFactory.create(groups=(group1, group2, group3)) 时,组声明会将传入的组添加到用户的组集中。
如果要在工厂内生成依赖项,请使用:
class VoucherFactory(django.DjangoModelFactory):
class Meta:
model = 'app.Voucher'
code = Faker('first_name')
is_enabled = fuzzy.FuzzyChoice([True, False])
start_date = fuzzy.FuzzyDateTime(datetime.datetime.now(pytz.utc))
end_date = fuzzy.FuzzyDateTime(datetime.datetime.now(pytz.utc))
@factory.post_generation
def member_roles(self, create, extracted, **kwargs):
if not create:
return
for _ in range(2): # <- if you want more than one
self.member_roles.add(GroupFactory())
我正在尝试使用 factoryboy 在我的项目中为 Django 模型创建测试数据。数据是通过 Faker
生成的,除了一个字段,即 ManyToManyField
;与来自 django.contrib.auth.model
命名组的另一个内置模型的多对多关系。
class Voucher(models.Model):
code = models.CharField(max_length=20, null=True, blank=True, unique=True)
is_enabled = models.BooleanField('enable voucher', default=True, help_text='A soft delete mechanism for the voucher.')
start_date = models.DateTimeField(null=True, blank=True)
end_date = models.DateTimeField(null=True, blank=True)
member_roles = models.ManyToManyField(to=Group, related_name='member_roles')
def __str__(self):
return "{}".format(self.code)
class Meta:
verbose_name = 'Voucher'
verbose_name_plural = 'Vouchers'
这是我的模型,这是我创建的用于生成虚拟数据的工厂:
class VoucherFactory(django.DjangoModelFactory):
class Meta:
model = 'app.Voucher'
code = Faker('first_name')
is_enabled = fuzzy.FuzzyChoice([True, False])
start_date = fuzzy.FuzzyDateTime(datetime.datetime.now(pytz.utc))
end_date = fuzzy.FuzzyDateTime(datetime.datetime.now(pytz.utc))
@factory.post_generation
def member_roles(self, create, extracted, **kwargs):
if not create:
return
if extracted:
for member_role in extracted:
self.member_roles.add(member_role)
除了 voucher_member_roles
table 根据 Voucher
模型中的多对多关系创建的数据外,数据已成功填充。我希望这个 table 也被填充。
我错过了什么?
制作凭证工厂时需要传入member_roles。例如:
VoucherFactory.create(member_roles=[member_role1, member_role2])
请参阅 http://factoryboy.readthedocs.io/en/latest/recipes.html#simple-many-to-many-relationship 其中指出:
调用 UserFactory() 或 UserFactory.build() 时,不会创建组绑定。 但是当调用 UserFactory.create(groups=(group1, group2, group3)) 时,组声明会将传入的组添加到用户的组集中。
如果要在工厂内生成依赖项,请使用:
class VoucherFactory(django.DjangoModelFactory):
class Meta:
model = 'app.Voucher'
code = Faker('first_name')
is_enabled = fuzzy.FuzzyChoice([True, False])
start_date = fuzzy.FuzzyDateTime(datetime.datetime.now(pytz.utc))
end_date = fuzzy.FuzzyDateTime(datetime.datetime.now(pytz.utc))
@factory.post_generation
def member_roles(self, create, extracted, **kwargs):
if not create:
return
for _ in range(2): # <- if you want more than one
self.member_roles.add(GroupFactory())