如何将工厂男孩实例转换为 json
How to convert factory boy instance as 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)
它returns:
{'first_name': "Agent 001", 'username': 'john_doe', 'language': <Language: Catalan>}
其中语言是另一个模型工厂,但我需要它作为 json 到 post 或补丁测试。
我怎样才能得到这样的东西?
{'first_name': "Agent 001", 'username': 'john_doe', 'language': [{'name': 'English'}, {'name': 'French'}]}
正如评论中提到的,工厂男孩本身并没有内部字典工厂。
github 中的答案有效。
首先你应该创建一个获取工厂 class 并听写其中所有 classes 的函数:
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)
最后 if call UserDictFactory()
returns 我们需要什么。
我正在使用 Mahmood 的答案,我意识到它不能正常用于列表(当 foos = factory.List(FooFactory)
时)。在这种情况下,我们希望得到一个列表,但是使用原始代码我们得到一个字典,其中键是作为字符串的列表索引。
我做了以下修改来修复它:
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, Any]:
stub_dict = stub.__dict__
for key, value in stub_dict.items():
if isinstance(value, 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, **kwargs):
stub = factory.stub(**kwargs)
stub_dict = convert_dict_from_stub(stub)
return stub_dict
return partial(dict_factory, factory)
我有一个与其他模型相关的模型,我想用 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)
它returns:
{'first_name': "Agent 001", 'username': 'john_doe', 'language': <Language: Catalan>}
其中语言是另一个模型工厂,但我需要它作为 json 到 post 或补丁测试。
我怎样才能得到这样的东西?
{'first_name': "Agent 001", 'username': 'john_doe', 'language': [{'name': 'English'}, {'name': 'French'}]}
正如评论中提到的,工厂男孩本身并没有内部字典工厂。 github 中的答案有效。
首先你应该创建一个获取工厂 class 并听写其中所有 classes 的函数:
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)
最后 if call UserDictFactory()
returns 我们需要什么。
我正在使用 Mahmood 的答案,我意识到它不能正常用于列表(当 foos = factory.List(FooFactory)
时)。在这种情况下,我们希望得到一个列表,但是使用原始代码我们得到一个字典,其中键是作为字符串的列表索引。
我做了以下修改来修复它:
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, Any]:
stub_dict = stub.__dict__
for key, value in stub_dict.items():
if isinstance(value, 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, **kwargs):
stub = factory.stub(**kwargs)
stub_dict = convert_dict_from_stub(stub)
return stub_dict
return partial(dict_factory, factory)