Flask + sqlalchemy + зефир - Ошибка в отношениях - Один ко многим

Почему этот код возвращает ошибку?

Ошибка: при инициализации маппера 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

person user14272    schedule 23.12.2019    source источник
comment
может попробовать переместить PessoaSchema после урока Imovel   -  person D Dhaliwal    schedule 23.12.2019


Ответы (1)


У вас проблема с "порядком декларирования". Отношения инициализируются немедленно, когда их Mappers создаются, когда отношение определяется с помощью String. Но когда вы определяете отношения на «Imovel», вам еще предстоит объявить Mapper с именем «Imovel». Через пару строк после этого определяется Imovel Mapper или класс.

Таким образом, вы можете переместить Imovel Mapper над Pessoa Mapper, за исключением того, что тогда вы получите точно такую ​​​​же ошибку, поскольку вы также строите отношения из Imovel в Pessoa.

Поэтому вместо этого вы хотите объявить свои отношения с помощью вызываемой функции, которая вернет Mapper «Imovel». Эта функция обычно вызывается только после того, как будут построены все Mappers. Таким образом, используя лямбда-функцию, мы можем гарантировать, что отношение не будет вызвано до тех пор, пока у вас не будет возможности настроить класс Imovel.

На практике, чтобы исправить эту ошибку, замените эту строку

imovelList = db.relationship("Imovel", back_populates="PessoaList")

с этим

imovelList = db.relationship(lambda: Imovel, back_populates="PessoaList")
person steve    schedule 24.12.2019