Почему не эта альтернатива устаревшей Factory.set_creation_function, работающей с nosetests?

Factory Мальчик устарел от set_creation_function (см. ChangeLog 2.6.1) и рекомендует разработчикам

Заменить factory.set_creation_function (SomeFactory, creation_function) с переопределением метода _create() SomeFactory

У меня есть i) ряд производных классов factory и ii) мой сеанс db, созданный в другом модуле, поэтому я попытался заменить рабочий пример из https://github.com/mattupstate/overholt со вторым блоком кода ниже. PyCharm предупреждает меня, что импорт "db" не используется, поэтому я подозреваю, что он не может быть разыменован правильно, когда я устанавливаю sqlalchemy_session?

Работа с nosetests 1.3.7 (но FactoryBoy set_creation_function теперь устарела):

from myapp.core import db

def create_sqlalchemy_model_function(class_to_create, *args, **kwargs):
    entity = class_to_create(**kwargs)
    db.session.add(entity)
    db.session.commit()
    return entity

Factory.set_creation_function(create_sqlalchemy_model_function)

Не работает с nosetests 2.x(похоже, что db неправильно ссылается?)

from factory.alchemy import SQLAlchemyModelFactory as Factory
from myapp.core import db

class Factory():
    class Meta:
        sqlalchemy_session = db.session

    def _create(cls, model_class, *args, **kwargs):
        entity = model_class(*args, **kwargs)
        db.session.add(entity)
        db.session.commit()
        return entity

Ответ 1

Две основные проблемы с вашим примером нерабочего кода:

  • класс должен быть получен из SQLAlchemyModelFactory class
  • Метод _create() должен быть определен как classmethod

Фиксированная версия:

from factory.alchemy import SQLAlchemyModelFactory as Factory
from myapp.core import db

class MyFactory(Factory):
    class Meta:
        sqlalchemy_session = db.session

    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        entity = model_class(*args, **kwargs)
        db.session.add(entity)
        db.session.commit()
        return entity

Здесь также образец модели factory, переопределяющий метод _create().