python - Cannot define inter dependent relationships among models using SQLAlchemy
问题描述
In following code examples ChatMessage
model has required field converstaion_id
which defines the relationship with ChatConversation
of that model. ChatConverstation
model has a field last_message_id
which is the reference to the last ChatMessage
.
I am getting following error message from sqlalchemy
and do not know how to resolve this issue. Please help.
sqlalchemy.exc.InvalidRequestError: When initializing mapper mapped class ChatConversation->chat_conversation, expression 'ChatMessage' failed to locate a name ('ChatMessage'). If this is a class name, consider adding this relationship() to the <class 'chat.models.conversation.ChatConversation'> class after both dependent classes have been defined.
How should I define schema for these models so that I can set both relationships (ie. conversation
relationship in ChatMessage
model and last_message
relationship in ChatConversation
model) ?
class ChatConversation(db.Model):
__tablename__ = 'chat_conversation'
id = db.Column(db.Integer, primary_key=True)
last_message_id = db.Column(
db.Integer,
db.ForeignKey("chat_message.id", ondelete='SET NULL'),
nullable = True
)
last_message = db.relationship('ChatMessage')
class ChatMessage(db.Model):
__tablename__ = 'chat_message'
id = db.Column(db.Integer, primary_key=True)
conversation_id = db.Column(
db.Integer,
db.ForeignKey("chat_conversation.id", ondelete='CASCADE'),
nullable=False
)
conversation = db.relationship('ChatConversation')
解决方案
解决方案是使用hybrid_property
方法装饰器sqlalchemy
并foreign_keys
显式定义来解决ForeignKey
.
from sqlalchemy.ext.hybrid import hybrid_property
class ChatConversation(db.Model):
__tablename__ = 'chat_conversation'
id = db.Column(db.Integer, primary_key=True)
last_message_id = db.Column(
db.Integer,
db.ForeignKey("chat_message.id", ondelete='SET NULL'),
nullable = True
)
@hybrid_property
def last_message(self):
return False if not self.last_message_id else ChatMessage.query.get(self.last_message_id)
class ChatMessage(db.Model):
__tablename__ = 'chat_message'
id = db.Column(db.Integer, primary_key=True)
conversation_id = db.Column(
db.Integer,
db.ForeignKey("chat_conversation.id", ondelete='CASCADE'),
nullable=False
)
conversation = db.relationship('ChatConversation', foreign_keys = [conversation_id])
推荐阅读
- c# - 找不到源 tpe“任务”的查询模式的实现
- > StockList" 选择未找到
- android - listview 的第一项和最后一项的作用相同
- c++ - 我有一个关于 C++ boost :: asio 和 std :: async 的问题
- c - 当表达式是条件表达式时终止while循环的内容
- typescript - 打字稿:在具有作为类一部分的参数的类上创建方法
- html - 在 Bootstrap 导航栏(Z-index)后面很难定位图像
- powershell - PowerShell 模块限定名称和命令前缀
- blockchain - cordapp-samples 中公证人的前端
- asp.net-core - 具有多个参数的 RazorPages 锚标记助手
- c - 使用 POSIX 套接字的 TCP 客户端/服务器应用程序:服务器未接收到发送的第二个数据包