sqlalchemy.exc.CircularDependencyError: se ha detectado una dependencia circular

La lógica de negocios: una categoría puede tener múltiples atributos (1: M), como la categoría “Memoria” podría tener atributos de velocidad, tamaño, tipo, etc.

al mismo tiempo, una categoría podría estar ordenada por el valor del atributo (esto se almacena dentro de Category.sortByAttribute, que es una clave externa para la tabla LookupCategoryAttributes).

Intentando construirlo a través de SQLAlchemy, pero detectando una dependencia circular. ¿Qué está mal?

class Attribute(Base): __tablename__ = "LookupCategoryAttributes" types = ["date", "float", "integer", "select", "string", "text"] # Properties ID = Column(BigInteger, primary_key=True) categoryID = Column(BigInteger, ForeignKey('LookupCategories.ID'), nullable=False ) attribute = Column(VARCHAR(255), nullable=False) listValues = Column(VARCHAR(4000)) typeID = Column(VARCHAR(40), nullable=False) isRequired = Column(SmallInteger, nullable=False, default=0) displayInMenu = Column(SmallInteger, nullable=False, default=0) displayInFilter = Column(SmallInteger, nullable=False, default=0) class Category(Base): __tablename__ = "LookupCategories" # Properties ID = Column(BigInteger, primary_key=True) category = Column(VARCHAR(255), nullable=False) description = Column(VARCHAR(1000), nullable=False) parentCategoryID = Column(BigInteger, ForeignKey('LookupCategories.ID')) leftPos = Column(Integer) rightPos = Column(Integer) sortByAttribute = Column(BigInteger, ForeignKey('LookupCategoryAttributes.ID')) sortOrder = Column(SmallInteger, default=1) # Relationships ParentCategory = relationship("Category", uselist=False, remote_side=[ID], backref='SubCategories') SortByAttribute = relationship("Attribute", uselist=False, foreign_keys=[sortByAttribute], primaryjoin="Attribute.ID==Category.sortByAttribute") Attributes = relationship("Attribute", backref="Category", primaryjoin="Attribute.categoryID==Category.ID") 

y luego el código se ve así:

 category = Category(record['Name'], extID=extID) attr1 = Attribute(v) attr2 = Attribute(v) category.Attributes.append(attr1) category.Attributes.append(attr2) category.SortByAttribute = attr1 

Cuando ejecuto commit obtengo:

 sqlalchemy.exc.CircularDependencyError: Circular dependency detected. 

De acuerdo, encontré la respuesta: use post_update en la relación http://docs.sqlalchemy.org/en/latest/orm/relationship_persistence.html#post-update

así que lo que hice es dentro de la categoría de categoría se cambia esto:

 SortByAttribute = relationship( "Attribute", uselist=False, foreign_keys=[sortByAttribute], primaryjoin="Attribute.ID==Category.sortByAttribute" ) 

a esto:

 SortByAttribute = relationship( "Attribute", uselist=False, foreign_keys=[sortByAttribute], primaryjoin="Attribute.ID==Category.sortByAttribute", post_update=True )