烧瓶+ sqlalchemy +棉花糖-关系错误-一对多

时间:2019-12-23 12:37:50

标签: python flask sqlalchemy marshmallow

为什么此代码返回错误?

  

错误:初始化映射器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

1 个答案:

答案 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")