问题描述
我需要 SubFactory 的属性而不是它创建的对象。
# models.py
class User:
pass
class UserProfile:
user = models.OnetoOneField(User)
class Job:
user = models.ForeignKey(User)
# factories.py
class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = User
class UserProfileFactory(factory.django.DjangoModelFactory):
class Meta:
model = UserProfile
user = factory.SubFactory(UserFactory)
class JobFactory(factory.django.DjangoModelFactory):
class Meta:
model = Job
# for certain reasons,I want to use UserProfileFactory here but get the user generated from it
user = factory.SubFactory(UserProfileFactory).user # doesn't work but you get the idea
解决方法
最好的方法是结合class Params
和factory.SelfAttribute
:
class JobFactory(factory.django.DjangoModelFactory):
class Meta:
model = Job
class Params:
profile = factory.SubFactory(ProfileFactory)
user = factory.SelfAttribute("profile.user")
一个参数在工厂内部使用,但在调用模型之前被丢弃。
这样:
- 如果您有资料,您可以向工厂提供资料:
JobFactory(profile=foo)
- 您可以设置个人资料用户的一些子字段:
JobFactory(profile__user__username="john.doe")
我采用了以下可能对某些人有用的方法:
user = factory.LazyFunction(lambda: UserProfileFactory().user)
也就是说,如果这是使用工厂的合法方式,它没有记录在案,所以如果这是错误的,请随时纠正。