首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂男孩:定义依赖于其他字段的字段

工厂男孩:定义依赖于其他字段的字段
EN

Stack Overflow用户
提问于 2015-11-27 23:02:02
回答 2查看 6.6K关注 0票数 22

如何使用factory-boy定义依赖于其他字段的字段

例如,我想定义一个依赖于emailfirst namelast nameUser

我试过用post_generation装饰器。但是,我的系统需要在创建实例之前定义电子邮件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-27 23:02:02

使用LazyAttribute

从医生那里: LazyAttribute是一个简单但非常强大的建筑砖,用于扩展工厂。 它以一个方法(通常是lambda)作为参数;该方法应该接受构建的对象为唯一的参数,并返回一个值。

代码语言:javascript
复制
class UserFactory(factory.Factory):
    class Meta:
        model = User

    username = 'john'
    email = factory.LazyAttribute(lambda o: '%s@example.com' % o.username)

或者是属性装饰师。

从医生那里: 如果一个简单的lambda还不够,您可以使用lazy_attribute()装饰器。 这修饰了一个实例方法,该方法应该采用单个参数self;方法的名称将用作属性的名称,以填充该方法的返回值:

代码语言:javascript
复制
class UserFactory(factory.Factory)
    class Meta:
        model = User

    name = u"Jean"

    @factory.lazy_attribute
    def email(self):
        # Convert to plain ascii text
        clean_name = (unicodedata.normalize('NFKD', self.name)
                        .encode('ascii', 'ignore')
                        .decode('utf8'))
        return u'%s@example.com' % clean_name
票数 31
EN

Stack Overflow用户

发布于 2021-09-23 01:56:11

对于依赖于其他字段的字段,也可以使用factory.SelfAttribute

在您的例子中,LazyAttribute工作得很好,这很明显,但是如果您需要做一些更复杂的事情,SelfAttribute将是一个更好的选择。

例如,假设我们有一个名为Course的实体,它带有start_dateend_date。每门课程都有一个期末考试,必须在课程开始后和课程结束之前参加。那么,model.py应该是这样的:

代码语言:javascript
复制
class Course(models.Model):
    start_date = models.DateTimeField(auto_now_add=False, blank=False)
    end_date = models.DateTimeField(auto_now_add=False, blank=False)

class Test(models.Model):
    course = models.ForeignKey(
        to=Course, blank=False, null=False, on_delete=models.CASCADE
    )
    date = models.DateField()

现在,让我们创建我们的factory.py:

代码语言:javascript
复制
class CourseFactory(DjangoModelFactory):
    class Meta:
        model = Course

    start_date = factory.Faker(
        "date_time_this_month", before_now=True, after_now=False, tzinfo=pytz.UTC
    )
    end_date = factory.Faker(
        "date_time_this_month", before_now=False, after_now=True, tzinfo=pytz.UTC
    )

class TestFactory(DjangoModelFactory):
    class Meta:
        model = Test

    date = factory.Faker(
        "date_between_dates",
        date_start=factory.SelfAttribute('..course.start_date'),
        date_end=factory.SelfAttribute('..course.end_date')
    )
    course = factory.SubFactory(CourseFactory)

正如您在TestFactory中所看到的,我们可以引用正在构造的对象的另一个字段,或其属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33965786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档