FactoryBoy 覆盖属性
FactoryBoy overriding Attributes
我想将 FactoryBoy 与 User/Profile 模式一起使用,如其文档中所述。
class ProfileFactory(DjangoModelFactory):
class Meta:
model = Profile
first_name = lazy_attribute(lambda o: faker.first_name())
user = SubFactory('profiles.tests.factories.UserFactory', profile=None)
class UserFactory(DjangoModelFactory):
class Meta:
model = settings.AUTH_USER_MODEL
username = lazy_attribute(lambda o: faker.first_name())
profile = RelatedFactory(ProfileFactory, 'user')
现在我希望能够通过仅提供用户名来创建用户,例如
u = UserFactory(username='alice')
并自动获取个人资料first_name (='Alice'
)中的用户名
或first_name喜欢
u = UserFactory(profile__first_name='Bob')
并根据给定的first_name
获取用户名(='bob'
)设置
或者,如果我很活泼,请提供用户名和 first_name,当然还要保留这两个
u = UserFactory(username='alice', profile__first_name='Bob')
到目前为止,我还没有找到实施此行为的正确位置。我尝试覆盖 _generate()
,但发现这不是正确的位置,因为此时我的惰性属性已经触发。此外,我无法在 UserFactory
.
中覆盖 __call__()
或 __new__()
也许这都是因为我对 python 还很陌生,所以如果能帮助我朝着正确的方向前进,我将不胜感激。
尽管我觉得在这里回答我自己的第一个问题有点愚蠢,但我想我自己找到了答案:
看起来最好的重写方法是 BaseFactory
中的 attributes
,因为所有 building/creating 函数都调用它,我仍然得到 'pure' kwargs
和 extra
到 fiddle 一样。
也许有人还有更好的答案,但在此之前这是我的版本。
@classmethod
def attributes(cls, create=False, extra=None):
if extra:
if 'profile__first_name' in extra and 'username' not in extra:
extra['username'] = extra['profile__first_name'].lower()
elif 'username' in extra and 'profile__first_name' not in extra:
extra['profile__first_name'] = extra['username'].title()
return super().attributes(create, extra)
我想将 FactoryBoy 与 User/Profile 模式一起使用,如其文档中所述。
class ProfileFactory(DjangoModelFactory):
class Meta:
model = Profile
first_name = lazy_attribute(lambda o: faker.first_name())
user = SubFactory('profiles.tests.factories.UserFactory', profile=None)
class UserFactory(DjangoModelFactory):
class Meta:
model = settings.AUTH_USER_MODEL
username = lazy_attribute(lambda o: faker.first_name())
profile = RelatedFactory(ProfileFactory, 'user')
现在我希望能够通过仅提供用户名来创建用户,例如
u = UserFactory(username='alice')
并自动获取个人资料first_name (='Alice'
)中的用户名
或first_name喜欢
u = UserFactory(profile__first_name='Bob')
并根据给定的first_name
获取用户名(='bob'
)设置
或者,如果我很活泼,请提供用户名和 first_name,当然还要保留这两个
u = UserFactory(username='alice', profile__first_name='Bob')
到目前为止,我还没有找到实施此行为的正确位置。我尝试覆盖 _generate()
,但发现这不是正确的位置,因为此时我的惰性属性已经触发。此外,我无法在 UserFactory
.
__call__()
或 __new__()
也许这都是因为我对 python 还很陌生,所以如果能帮助我朝着正确的方向前进,我将不胜感激。
尽管我觉得在这里回答我自己的第一个问题有点愚蠢,但我想我自己找到了答案:
看起来最好的重写方法是 BaseFactory
中的 attributes
,因为所有 building/creating 函数都调用它,我仍然得到 'pure' kwargs
和 extra
到 fiddle 一样。
也许有人还有更好的答案,但在此之前这是我的版本。
@classmethod
def attributes(cls, create=False, extra=None):
if extra:
if 'profile__first_name' in extra and 'username' not in extra:
extra['username'] = extra['profile__first_name'].lower()
elif 'username' in extra and 'profile__first_name' not in extra:
extra['profile__first_name'] = extra['username'].title()
return super().attributes(create, extra)