SQLAlchemy:声明的\u attr列的外键

SQLAlchemy:声明的\u attr列的外键,sqlalchemy,Sqlalchemy,我在使用带有声明的\u attr列的foreign\u keys参数时遇到问题。我的模型是这样的: class BasicTable(object): created = db.Column(db.DateTime) last_modified = db.Column(db.DateTime) @declared_attr def created_by_id(cls): return db.Column(db.Integer, db.ForeignKey("app_us

我在使用带有声明的\u attr列的foreign\u keys参数时遇到问题。我的模型是这样的:

class BasicTable(object):
  created = db.Column(db.DateTime)
  last_modified = db.Column(db.DateTime)

  @declared_attr
  def created_by_id(cls):
    return db.Column(db.Integer, db.ForeignKey("app_user.id", use_alter = True, name='fk_created_by_id'))

  @declared_attr
  def created_by(cls):
    return db.relationship("AppUser", foreign_keys='{}.{}'.format(cls.__tablename__, 'created_by_id'))

  @declared_attr
  def last_modified_by_id(cls):
    return db.Column(db.Integer, db.ForeignKey("app_user.id", use_alter = True, name='fk_last_modified_by_id'))

  @declared_attr
  def last_modified_by(cls):
    return db.relationship("AppUser", foreign_keys='{}.{}'.format(cls.__tablename__, 'last_modified_by_id'))

class AppUser(BasicTable, db.Model):
  id = db.Column(db.Integer, primary_key=True)
  email = db.Column(db.String(64))
  service_id = db.Column(db.Integer, db.ForeignKey("service.id"))
foreign_keys=lambda: cls.created_by_id
因为BasicTable中有两列引用了AppUser,所以我得到了“不明确的外键”错误,所以我尝试使用如上所述的foreign_keys参数。上面给出了这个错误:

AttributeError: 'Table' object has no attribute 'last_modified_by_id'
InvalidRequestError: When initializing mapper Mapper|AppUser|app_user, expression 'BasicTable' failed to locate a name ("name 'BasicTable' is not defined"). If this is a class name, consider adding this relationship() to the <class 'app.models.AppUser'> class after both dependent classes have been defined.
当我检查数据库时,该字段确实存在于所有使用BasicTable的表中。发生此错误是因为我正在引用已声明的\u attr列吗?建议如此,但当我尝试使用lambda技术时,如下所示:

class BasicTable(object):
  created = db.Column(db.DateTime)
  last_modified = db.Column(db.DateTime)

  @declared_attr
  def created_by_id(cls):
    return db.Column(db.Integer, db.ForeignKey("app_user.id", use_alter = True, name='fk_created_by_id'))

  @declared_attr
  def created_by(cls):
    return db.relationship("AppUser", foreign_keys='{}.{}'.format(cls.__tablename__, 'created_by_id'))

  @declared_attr
  def last_modified_by_id(cls):
    return db.Column(db.Integer, db.ForeignKey("app_user.id", use_alter = True, name='fk_last_modified_by_id'))

  @declared_attr
  def last_modified_by(cls):
    return db.relationship("AppUser", foreign_keys='{}.{}'.format(cls.__tablename__, 'last_modified_by_id'))

class AppUser(BasicTable, db.Model):
  id = db.Column(db.Integer, primary_key=True)
  email = db.Column(db.String(64))
  service_id = db.Column(db.Integer, db.ForeignKey("service.id"))
foreign_keys=lambda: cls.created_by_id
我得到这个错误:

AttributeError: 'Table' object has no attribute 'last_modified_by_id'
InvalidRequestError: When initializing mapper Mapper|AppUser|app_user, expression 'BasicTable' failed to locate a name ("name 'BasicTable' is not defined"). If this is a class name, consider adding this relationship() to the <class 'app.models.AppUser'> class after both dependent classes have been defined.
InvalidRequestError:初始化映射器映射器| AppUser | app|u user时,表达式“BasicTable”未能找到名称(“未定义名称“BasicTable”)。如果这是类名,那么在定义了两个依赖类之后,考虑将此关系()添加到类中。
有办法解决这个问题吗?谢谢

class BasicTable(object):
  created = db.Column(db.DateTime)
  last_modified = db.Column(db.DateTime)

  @declared_attr
  def created_by_id(cls):
    return db.Column(db.Integer, db.ForeignKey("app_user.id", use_alter = True, name='fk_created_by_id'))

  @declared_attr
  def created_by(cls):
    return db.relationship('AppUser', primaryjoin='%s.created_by_id==AppUser.id' % cls.__name__, 
                           remote_side='AppUser.id')

  @declared_attr
  def last_modified_by_id(cls):
    return db.Column(db.Integer, db.ForeignKey("app_user.id", use_alter = True, name='fk_last_modified_by_id'))

  @declared_attr
  def last_modified_by(cls):
    return db.relationship('AppUser', primaryjoin='%s.last_modified_by_id==AppUser.id' % cls.__name__, 
                           remote_side='AppUser.id')