微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将工厂男孩实例转换为 json

如何解决如何将工厂男孩实例转换为 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?