2011-04-30 12 views
17

Tengo dos tablas, News y Files:SQLAlchemy dependencia circular - cómo resolverlo?

# unrelated columns removed 
class News(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    file_id_logo = db.Column(db.Integer, db.ForeignKey('files.id')) 
    logo = db.relationship('File', lazy=False) 

class File(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    news_id = db.Column(db.Integer, db.ForeignKey('news.id')) 
    news = db.relationship('News', lazy=False, backref=db.backref('files')) 

Después de añadir la tecla f file_id_logo, sqlalchemy planteado una CircularDependencyError. Ya he intentado post_update=True en la relación logo, pero no ha cambiado nada.

¿Cuál es la forma correcta de resolver esto?

Los siguientes casos son posibles (en caso de que importe):

  • Un archivo no tiene o tiene exactamente un Noticias asignado.
  • Si un archivo no tiene noticias, tampoco hay noticias con este archivo al que se hace referencia como su logotipo.
  • Puede haber múltiples archivos para una sola noticia, pero solo uno de estos archivos puede ser logo.
  • Así que si una noticia tiene un logo, el archivo al que se hace referencia también tiene esta noticia como news.

Respuesta

22

use_alter - pasa a la ForeignKeyConstraint subyacente para indicar que la restricción debe generarse/soltarse externamente desde la instrucción CREATE TABLE/DROP TABLE. Vea el constructor de las clases para más detalles.

http://docs.sqlalchemy.org/en/rel_0_8/core/schema.html?highlight=use_alter#foreign-key-api-constructs

+0

funcionó bien para deshacerse del error, pero se rompió algunas otras relaciones. Así que decidí simplemente deshacerme de ForeignKey. Aceptarlo de todos modos ya que la respuesta en sí es correcta. – ThiefMaster

+2

@ThiefMaster Probablemente solo necesites establecer primaryjoin en tu relación: no pueden determinar la dirección de unión cuando hay múltiples relaciones/backrefs entre dos tablas. – letitbee

+0

Encontré la información aquí: http://docs.sqlalchemy.org/en/rel_0_8/core/constraints.html –

Cuestiones relacionadas