为什么此代码返回错误?
错误:初始化映射器Mapper | Pessoa | pessoa时,表达式'Imovel'找不到名称(“名称'Imovel'未定义”)。
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
db=SQLAlchemy()
ma=Marshmallow()
class Pessoa(db.Model):
__tablename__ = 'pessoa'
idLocal= db.Column(db.Integer, primary_key=True)
Nome=db.Column(db.String(100), default=u'')
imovelList = db.relationship("Imovel", back_populates="PessoaList")
def get_id(self):
return self.idLocal
class PessoaSchema(ma.ModelSchema):
class Meta: model = Pessoa
class Imovel(db.Model):
__tablename__ = 'imovel'
idLocal= db.Column(db.Integer, primary_key=True)
CodigoImovel=db.Column(db.String(30), default=u'')
idPessoa = db.Column(db.Integer, db.ForeignKey('pessoa.idLocal'))
PessoaList = db.relationship("Pessoa", back_populates="imovelList")
def get_id(self):
return self.idLocal
class ImovelSchema(ma.ModelSchema):
class Meta: model = Imovel
答案 0 :(得分:1)
您遇到“申报单”问题。使用字符串定义关系时,在构造其映射器时,关系会立即初始化。但是,当您在“ Imovel”上定义关系时,您尚未声明一个名为“ Imovel”的映射器。在此之后的两行定义了Imovel Mapper或类。
因此,您可以将Imovel Mapper移到Pessoa Mapper上方,否则会得到完全相同的错误,因为您还在建立从Imovel到Pessoa的关系。
因此,您想使用可调用函数声明您的关系,该函数将返回“ Imovel”映射器。通常仅在构造完所有Mappers之后才调用此函数。因此,通过使用lambda函数,我们可以确保在您有机会设置Imovel类之前不会调用该关系。
实际上,要解决此错误,请替换此行
imovelList = db.relationship("Imovel", back_populates="PessoaList")
与此
imovelList = db.relationship(lambda: Imovel, back_populates="PessoaList")