首页 > 解决方案 > SQLAlchemy 一张表中的两个关系

问题描述

我有 3 张桌子:交易所、加密货币和交易。这些表是相关的:交易所可以有许多加密货币和许多交易。当我只有一段关系时,一切正常。在我添加交易表后,我遇到了很多错误。我使用 Flask SQLAlchemy 和 Marshmallow

交换模型:

class ExchangeModel(db.Model):

__tablename__ = 'exchanges'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False, unique=True)
amount = db.Column(db.Float(precision=2), default=0)
currency = db.Column(db.String(10), nullable=False)
cryptocurrencies = db.relationship('CryptocurrencyModel', lazy="dynamic" )
trades = db.relationship('TradeModel')

交换架构

from ma import ma
from schemas.trade import TradeSchema
from schemas.cryptocurrency import CryptocurrencySchema
from models.trade import TradeModel
from models.cryptocurrency import CryptocurrencyModel
from models.exchange import ExchangeModel

class ExchangeSchema(ma.SQLAlchemyAutoSchema):
  trades = ma.Nested(TradeSchema, many=True)
  cryptocurrencies = ma.Nested(CryptocurrencySchema, many=True)
  class Meta:
     model = ExchangeModel
     dump_only = ("id","amount")
     load_instance = True

加密货币模型:

class CryptocurrencyModel(db.Model):

__tablename__ = 'cryptocurrencies'
id = db.Column(db.Integer, primary_key=True)
amount = db.Column(db.Float(precision=5), default=0)
rate = db.Column(db.Float(precision=5), nullable=False)
shortcut = db.Column(db.String(10), nullable=False)
exchange_id = db.Column(db.Integer, db.ForeignKey('exchanges.id'), nullable=False)
exchange = db.relationship('ExchangeModel')

加密货币架构:

from ma import ma
from models.cryptocurrency import CryptocurrencyModel
from models.exchange import ExchangeModel
from marshmallow import Schema, fields, validate

class CryptocurrencySchema(ma.SQLAlchemyAutoSchema):
 class Meta:
    model = CryptocurrencyModel
    dump_only = ("id","amount")
    load_instance = True
    include_fk = True
shortcut = fields.Str(required=True, validate=[validate.Length(min=3)])

贸易模式:

class TradeModel(db.Model):

__tablename__ = 'trades'
id = db.Column(db.Integer, primary_key=True)
amount = db.Column(db.Float(precision=5), nullable=False)
currency_in = db.Column(db.String(10), nullable=False)
currency_out = db.Column(db.String(10), nullable=False)
created_date = 
db.Column(db.DateTime(timezone=True),server_default=db.func.current_timestamp())
exchange_id = db.Column(db.Integer, db.ForeignKey('exchanges.id'), nullable=False)
exchange = db.relationship('ExchangeModel')

交易模式:

from ma import ma
from models.trade import TradeModel
from models.exchange import ExchangeModel

class TradeSchema(ma.SQLAlchemyAutoSchema):
 class Meta:
    model = TradeModel
    dump_only = ("id", "amount", 'created_date')
    load_instance = True
    include_fk = True

错误是:

InvalidRequestError:初始化映射器映射类 ExchangeModel->exchanges 时,表达式“CryptocurrencyModel”未能找到名称(“CryptocurrencyModel”)。如果这是一个类名,请考虑在定义了两个依赖类之后将此 relationship() 添加到 <class 'models.exchange.ExchangeModel'> 类。

标签: pythonflasksqlalchemyflask-sqlalchemymarshmallow

解决方案


ExchangeModel.cryptocurrencies = db.relationship('CryptocurrencyModel', lazy="dynamic" ) 

在你声明之后CryptocurrencyModel

class CryptocurrencyModel(db.Model):

    __tablename__ = 'cryptocurrencies'
    id = db.Column(db.Integer, primary_key=True)
    amount = db.Column(db.Float(precision=5), default=0)
    rate = db.Column(db.Float(precision=5), nullable=False)
    shortcut = db.Column(db.String(10), nullable=False)
    exchange_id = db.Column(db.Integer, db.ForeignKey('exchanges.id'), nullable=False)
    exchange = db.relationship('ExchangeModel')


ExchangeModel.cryptocurrencies = db.relationship('CryptocurrencyModel', lazy="dynamic" ) 

推荐阅读