python - Django 工厂男孩 : fill modelfield with choices throws error

标签 python django factory factory-boy

我正在一家模型工厂工作,我正在尝试填写一个有选择列表的字段。当我尝试使用工厂创建一个对象并尝试从选择列表中填充随机选择时,会引发异常:

TypeError: 'choice' is an invalid keyword argument for this function

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/factory/base.py", line 551, in build
    return cls._generate(enums.BUILD_STRATEGY, kwargs)
  File "/usr/local/lib/python2.7/dist-packages/factory/base.py", line 505, in _generate
    return step.build()
  File "/usr/local/lib/python2.7/dist-packages/factory/builder.py", line 279, in build
    kwargs=kwargs,
  File "/usr/local/lib/python2.7/dist-packages/factory/base.py", line 312, in instantiate
    return self.factory._build(model, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/factory/base.py", line 531, in _build
    return model_class(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 571, in __init__
    raise TypeError("'%s' is an invalid keyword argument for this function" % list(kwargs)[0])
TypeError: 'choice' is an invalid keyword argument for this function

使用的版本:

django==1.11
factory-boy==2.9.2
python==2.7.12

(裁剪后的)模型:

class Server(models.Model):

    TEST = 'test'
    ACCEPT = 'accept'

    SERVER_TYPES = (
        (TEST, _("Testing Server")),
        (ACCEPT, _("Acceptation Server"))
    )

    type = models.CharField(_("Server type"), max_length=50, choices=SERVER_TYPES)

(裁剪后的)工厂:

class ServerFactory(factory.DjangoModelFactory):

    type = factory.Faker('random_element', elements=[choice[0] for choice in Server.SERVER_TYPES)

    class Meta:
        model = Server

我没有使用 Faker('random_element, elements=[..]),而是尝试使用 LazyFunction:

def get_server_type():
    choices = [choice[0] for choice in Server.SERVER_TYPES]
    return random.choice(choices)

class ServerFactory(factory.DjangoModelFactory):

    organization = factory.SubFactory(OrganizationFactory)
    type = factory.LazyFunction(get_server_type)

    .. Meta ..

这也会引发相同的错误。我也找不到任何真正的其他替代方案来解决这个问题。对于如何在使用 factory 包时使用 SERVER_TYPES 选项之一填充 type 字段,有什么建议吗?

最佳答案

你能试试这个吗?

from random import choice
type = factory.LazyAttribute(lambda x: choice(Server.SERVER_TYPES)[0])

基于问题最初描述的旧评论:

应该是type =factory.Faker('random_element', elements=[choice[0] for choice in Server.SERVER_TYPES])

关于python - Django 工厂男孩 : fill modelfield with choices throws error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49371682/

相关文章:

python - numpy.searchsorted 有多个来源

django - 如何在 for 循环中反向计数查询集?

python - 具有不同模板和参数的 Django 注册基于类的 View

Django 模型中的 Python factory_boy 库 m2m?

python - 改变 django-allauth render_authentication_error 行为

javascript - 如何从 Nuxt.js SPA 运行 Python 脚本?

python - pydev:查找对函数的所有引用

python - 我需要导入什么才能访问我的模型?

java - java spring bean工厂可以返回bean列表吗?

kotlin - Kotlin-可扩展的类型安全的构建器