python - one - ¿Por qué esta alternativa a la Factory.set_creation_function obsoleta no funciona con nosetest?
pagination in flask sqlalchemy (1)
Factory Boy desaprobó set_creation_function (ver ChangeLog 2.6.1 ) y recomienda que los desarrolladores
Reemplazar factory.set_creation_function (SomeFactory, creation_function) con una anulación del método _create () de SomeFactory
Tengo i) varias clases de fábrica de derivados y ii) mi sesión de db instanciada en otro módulo, así que traté de reemplazar el ejemplo de trabajo de https://github.com/mattupstate/overholt con el segundo bloque de código a continuación. PyCharm me está advirtiendo que la importación "db" no se está utilizando, así que sospecho que no se está desreferenciando correctamente cuando configuro sqlalchemy_session ?
Trabajar con nosetests 1.3.7 (pero la set_creation_function de FactoryBoy ahora está en desuso):
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)
No funciona con nosetests 2.x (parece que db no está siendo referenciado correctamente?)
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
Dos problemas principales con su código no funcional de muestra:
- la clase debe derivarse de la clase
SQLAlchemyModelFactory
- el método
_create()
debe definirse comoclassmethod
Versión arreglada:
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
Aquí también hay una muestra de la fábrica de modelos que _create()
método _create()
.