我想在Django项目中使用Factory Boy和Faker,我想创建推导的属性,这意味着方法从中Faker
返回彼此依赖的一组值。这些值将用于工厂类的其他属性。
示例:location_on_land
方法从中faker.providers.geo
返回纬度,经度,地名,两个字母的国家代码和时区的元组(例如('38 .70734','-77.02303','华盛顿堡','US','America / New_York')所有值彼此依赖,由于坐标定义的地方,国家,时区等THEREFOR我不能使用分离功能用于(懒惰)属性,如faker.providers.latitude
,faker.providers.longitude
。
是否可以以某种方式访问lazy属性的返回值以将其用于其他推导属性?有没有更好的方法来访问返回值,location_on_land
以将其用于其他依赖属性,我的工厂类如下所示:
# factory_models.py
class OriginFactory(factory.django.DjangoModelFactory):
"""Factory for Origin."""
class Meta:
model = models.Origin
exclude = [
"geo_data",
]
# not working since not a lazy attribute
# lat, lon, place, iso_3166_alpha_2, _ = fake.location_on_land()
# desired outcome (not working)
geo_data = factory.Faker("location_on_land")
# attributes using the return values of `location_on_land` from lazy attribute (pseudo-code, desired)
latitude = geo_data[...][0]
longitude = geo_data[...][1]
# foreign key
iso_3166_alpha_2 = models.Country.objects.get(iso_3166_alpha_2=geo_data[...][2])
...
# models.py
class Origin(models.Model):
origin_id = models.AutoField(
primary_key=True,
db_column="origin_id",
)
latitude = models.FloatField(
null=True,
db_column="latitude",
)
longitude = models.FloatField(
null=True,
db_column="longitude",
)
region = models.CharField(
max_length=100,
blank=True,
db_column="region",
)
iso_3166_alpha_2 = models.ForeignKey(
to=Country,
on_delete=models.PROTECT,
db_column="iso_3166_alpha_2",
...
)
使用时factory.Params
,结果属性可用于的第一个参数factory.LazyAttribute
:传入的实例是一个存根,用于为实际模型调用构建参数。
在你的情况下,我将选择以下工厂。
注意,该geo_data
字段被声明为参数(即未传递给models.Origin
构造函数);但是工厂中的其他声明仍然可以使用它。
class OriginFactory(factory.django.DjangoModelFactory):
class Meta:
model = models.Origin
class Params:
geo_data = factory.Faker('location_on_land')
latitude = factory.LazyAttribute(lambda o: o.geo_data[0])
longitude = factory.LazyAttribute(lambda o: o.geo_data[1])
iso_3166_alpha_2 = factory.LazyAttribute(
lambda o: models.Country.objects.get(iso_3166_alpha_2=o.geo_data[3])
)
非常感谢,我已经花了几个小时寻找解决方案!我对Factory Boy相当陌生,因此我根本不了解这
Params
门课。