Django FactoryBoy: заполнение поля модели выбором выдает ошибку

Я работаю над фабрикой для модели и пытаюсь заполнить поле со списком вариантов. Когда я пытаюсь создать объект с помощью Factory, где я пытаюсь заполнить случайный выбор из списка выбора, возникает исключение:

TypeError: «выбор» является недопустимым аргументом ключевого слова для этой функции.

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 ..

Это также вызывает ту же ошибку. Я также не могу найти никаких других реальных альтернатив, чтобы исправить это. Любые предложения, как я могу заполнить поле type одним из вариантов SERVER_TYPES при использовании пакета factory?


person Nrzonline    schedule 19.03.2018    source источник


Ответы (1)


Не могли бы вы попробовать это вместо этого?

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])

person trinchet    schedule 19.03.2018
comment
Спасибо за ваш ответ, и мои извинения за плохой копипаст. Я скопировал и вставил из redo, но было redo слишком рано. Это choice[0]. Я обновил свой вопрос. - person Nrzonline; 20.03.2018