FactoryBoy присваивает атрибут атрибуту SubFactory

При определении ModelFactory в FactoryBoy мне нужно получить доступ к атрибуту другой модели, созданной SubFactory, и назначить его этому атрибуту ModelFactory.

Вот что я хочу сделать:

import factory
class MyModelFactory(factory.DjangoModelFactory):
    FACTORY_FOR = MyModel

    created_by = factory.SubFactory(AdminUserFactory)**.id**

Очевидно, что это не работает, потому что нет объекта AdminUser для доступа к идентификатору в определении класса MyModelFactory.

Вот что я сделал, но это уродливо:

import factory
class MyModelFactory(factory.DjangoModelFactory):
    FACTORY_FOR = MyModel

    dummy_created_by = factory.SubFactory(AdminUserFactory)
    created_by = factory.LazyAttribute(lambda o: o.dummy_created_by.id)

    @classmethod
    def _create(cls, target_class, *args, **kwargs):
        del kwargs['dummy_created_by']
        return super(MyModelFactory, cls)._created(
            target_class, *args, **kwargs)

Я пытался прочитать документы Factory_Boy, но не смог увидеть класс или функцию, которая позволила бы мне лениво получить доступ к атрибуту. У кого-нибудь есть предложения?


person emispowder    schedule 31.07.2013    source источник
comment
Есть ли причина, по которой вы не можете просто создать связанную модель и передать этот объект в MyModelFactory.create()?   -  person Brian Dant    schedule 19.01.2014
comment
@BrianDant Да, вы определенно можете это сделать. Я просто искал способ сделать все за один раз и быть как можно более СУХИМ.   -  person emispowder    schedule 21.01.2014
comment
Прохладный. Благодарю за разъяснение.   -  person Brian Dant    schedule 24.01.2014


Ответы (3)



Используйте SelfAttribute:

class MyModelFactory(factory.django.DjangoModelFactory):
    FACTORY_FOR = MyModel
    dummy_created_by = factory.SubFactory(AdminUserFactory)
    created_by = factory.SelfAttribute('dummy_created_by.id')
person dustinfarris    schedule 16.06.2014
comment
Что, если мне нужно использовать SelfAttribute для присвоения результата вызова метода, а не атрибута? - person nnyby; 20.03.2015
comment
Можно ли получить дочерний объект dummy_created_by? Например, если AdminUserFactory создает AdminUser с некоторыми UserRight дочерними строками, могу ли я получить список прав пользователя или идентификаторы? Что-то вроде created_by = factory.SelfAttribute('dummy_created_by__user_right.id')? (Я понимаю, что могу factory.create UserRights, я просто пытаюсь аккуратно инкапсулировать код.) - person Chris; 07.10.2015

Попробуйте использовать Mixer:

from mixer.backend.django import mixer

mixer.blend(MyModel, created_by=lambda: mixer.blend(AdminUser).id)
person klen    schedule 07.01.2014
comment
Спасибо @klen, мне нужно проверить миксер. Но в этом проекте мы привержены FactoryBoy, поэтому я ищу разрешение FactoryBoy. - person emispowder; 21.01.2014