2012-04-27 16 views
9

Soy nuevo en la pirámide y he estado luchando por hacer algunos cambios en mi proyecto. Estoy tratando de dividir mis modelos/clases en archivos individuales en lugar de un único archivo models.py. Para hacerlo, he eliminado el viejo models.py y he creado una carpeta de modelos con el archivo __init__.py junto con un archivo para cada clase. En __init__.py importé la clase usando from .Foo import Foo.¿Cómo divido models.py en diferentes archivos para diferentes modelos en Pyramid?

Esto hace que las vistas funcionen correctamente y pueden inicializar un objeto.

Pero ejecutar el script initializedb no crea nuevas tablas como lo hizo cuando tenía todos los modelos en un solo models.py. No crea las tablas relevantes, sino que directamente intenta insertarlas.

¿Alguien me puede dar un ejemplo de una estructura de proyecto piramidal que tiene modelos en diferentes archivos?

Respuesta

20
myapp 
    __init__.py 
    scripts 
     __init__.py 
     initialize_db.py 
    models 
     __init__.py 
     meta.py 
     foo.py 
     moo.py 

ahora meta.py puede contener un compartían Base así como la DBSession:

Base = declarative_base() 
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension)) 

Cada foo.py y moo.py puede importar su base compartida desde meta.py.

from .meta import Base 

class Foo(Base): 
    pass 

Para asegurarse de que todas las tablas y los recogen, desde dentro de la models subpaquete, y por conveniencia, puede importarlos en models/__init__.py:

from .meta import DBSession 
from .foo import Foo 
from .moo import Moo 

Sin hacer algo como esto las diferentes tablas no se adjuntará al Base y, por lo tanto, no se creará cuando se invoque create_all.

Su guión initialize_db continuación, puede crear todas las tablas a través de

from myapp.models.meta import Base 
Base.metadata.create_all(bind=engine) 

Sus puntos de vista pueden importar los modelos de ganancias:

from myapp.models import DBSession 
from myapp.models import Foo 
+0

¡Gracias por la respuesta! Tengo curiosidad por saber por qué necesitamos el mismo objeto Base en todos los modelos. Pensé que Base sería un objeto estático/compartido que recogería todos los metadatos, independientemente de donde se invoque. – KaranK

+0

No necesita la misma base o metadatos, pero sin duda ayuda a mantener las cosas claras. Cada motor de base de datos debe tener un objeto de metadatos que describa el esquema para ese motor. En Python, los módulos solo se ejecutan cuando los importas, por lo que cuando rompes los modelos.py en múltiples módulos individuales, no se recogerán hasta que se importe cada uno de ellos. –

0

Tuve el mismo problema una vez.

La resolución de los archivos de modelo Splited: debe inicializar todas Base (padre) clases de sus archivos por separado:

#initializedb.py 
... 
from project.models.Foo import Base as FooBase 
from project.models.Moo import Base as MooBase 
... 

def main(argv=sys.argv): 
    ... 
    FooBase.metadata.create_all(engine) 
    MooBase.metadata.create_all(engine) 
+1

No estoy seguro de que es el mejor camino a seguir. Prefiero haber intentado importar Base en cada archivo de modelo. –

+0

@Antoine: Creo que 'from project.models.Foo import Base como FooBase' significa que hay una Base en cada archivo de modelo. Y ya lo estoy haciendo pero no funciona. @Vitali: ¿Sabes por qué tenemos que hacer esto de forma indirecta para crear bases separadas para cada modelo? – KaranK

+0

@KaranK: Mi sugerencia era tener una sola 'Base' en un archivo, e importar esa' Base' en cada archivo de modelo. No estoy seguro de que las relaciones funcionarían si usabas Bases diferentes. –

Cuestiones relacionadas