如何解决如何将工厂男孩实例转换为 json
我有一个与其他模型相关的模型,我想使用 factory boy
包制作模型工厂的实例,并将其作为 json
发送到 django rest 框架中的 rest API。
用户工厂:
class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = User
first_name = factory.Faker('name')
username = factory.Faker('word')
language = factory.SubFactory(LanguageFactory)
语言工厂:
class LanguageFactory(factory.django.DjangoModelFactory):
class Meta:
model = Language
name = factory.Faker('language_name')
当我使用时:
factory.build(dict,FACTORY_CLASS=UserFactory)
它返回:
{'first_name': "Agent 001",'username': 'john_doe','language': <Language: Catalan>}
语言是另一个模型工厂,但我需要它作为 json 来发布或补丁测试。
我怎么会得到这样的东西?
{'first_name': "Agent 001",'language': [{'name': 'English'},{'name': 'french'}]}
解决方法
正如评论中提到的,工厂男孩本身没有内部字典工厂。 github 中的答案有效。
首先你应该创建一个函数来获取工厂类和字典中的所有类:
from functools import partial
from typing import Any,Dict
from factory import Factory
from factory.base import StubObject
def generate_dict_factory(factory: Factory):
def convert_dict_from_stub(stub: StubObject) -> Dict[str,Any]:
stub_dict = stub.__dict__
for key,value in stub_dict.items():
if isinstance(value,StubObject):
stub_dict[key] = convert_dict_from_stub(value)
return stub_dict
def dict_factory(factory,**kwargs):
stub = factory.stub(**kwargs)
stub_dict = convert_dict_from_stub(stub)
return stub_dict
return partial(dict_factory,factory)
然后用于使用:
# example of usage
UserDictFactory = generate_dict_factory(UserFactory)
最后,如果调用 UserDictFactory()
返回我们需要的内容。
我使用了 Mahmood 的答案,我意识到它不能正常用于列表(当 foos = factory.List(FooFactory)
时)。在这种情况下,我们希望返回一个列表,但使用原始代码,我们返回一个 dict,其中键是作为字符串的列表索引。
我做了以下修改来修复它:
def generate_dict_factory(factory: factory.Factory):
def stub_is_list(stub: StubObject) -> bool:
try:
return all(k.isdigit() for k in stub.__dict__.keys())
except AttributeError:
return False
def convert_dict_from_stub(stub: StubObject) -> Dict[str,StubObject):
stub_dict[key] = (
[convert_dict_from_stub(v) for v in value.__dict__.values()]
if stub_is_list(value)
else convert_dict_from_stub(value)
)
return stub_dict
def dict_factory(factory,factory)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。