python - 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'> 类。
解决方案
放
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" )
推荐阅读
- python - 如何获取应用天蓝色表存储查询的不同值?
- apache-kafka - 想要一些如何使用kafkaUser的实际例子
- java - 如何在 java 类中获取每个字段及其子项的字符串表示形式?
- tabulator - 制表符 - 在 fitColumns 布局模式下保持列最小大小以适合数据
- python-3.x - 发现样本数量不一致的输入变量:[889, 418]
- java - 为什么Java(JAMA/math3)和Matlab/Python计算的特征值不一样?
- android - 无法从 WhatsApp 通知中获取图像
- java - Wildfly - 无法获得大于 256 的最大连接数
- amazon-web-services - 后端服务器的可信 SSL 证书
- lua - 如何给存储在字符串值中的用户名的玩家钱 - Roblox lua