温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - Deduced attributes of a LazyAttribute using Factory Boy
django factory-boy faker python

python - 使用Factory Boy推导的LazyAttribute的属性

发布于 2021-03-16 17:06:38

我想在Django项目中使用Factory BoyFaker,我想创建推导的属性,这意味着方法从中Faker返回彼此依赖的一组值。这些值将用于工厂类的其他属性。

示例:location_on_land 方法从中faker.providers.geo返回纬度,经度,地名,两个字母的国家代码和时区的元组(例如('38 .70734','-77.02303','华盛顿堡','US','America / New_York')所有值彼此依赖,由于坐标定义的地方,国家,时区等THEREFOR我不能使用分离功能用于(懒惰)属性,如faker.providers.latitudefaker.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",
    ...
    )

查看更多

提问者
AuthenticFood
被浏览
0
Xelnor 2020-11-19 02:21

使用时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])
    )