flask_sqlalchemy python3.9+ 的关系
relationship for flask_sqlalchemy python3.9+
我找不到通过 user.messages 和通过 channel.messages[ 获取用户所有消息的方法=27=]。我一直收到外键错误。我需要改变我的人际关系什么才能让它发挥作用?
我希望能够:
user.messages 和 channel.messages
作为额外的(如果可能的话):
message.user.username 或 message.user.id
我的类:
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
password = db.Column(db.String, nullable=False)
email = db.Column(db.String, unique=True, nullable=False)
admin = db.Column(db.Boolean, default=False)
mc_access = db.Column(db.Boolean, default=False)
pass_recov_code = db.Column(db.String, default=None)
all_messages = db.relationship("Message",
backref=db.backref("Message"),
primaryjoin="foreign(User.id) == remote(Message.sender_id)",
foreign_keys="[User.id, User.username]",
cascade="all, delete"
)
class Channel(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True, nullable=False)
uses_password = db.Column(db.Boolean, default=False)
password = db.Column(db.String)
online_users = db.Column(db.String, default=json.dumps([]))
messages = db.relationship("Message", cascade="all, delete", foreign_keys="[Channel.id]", backref=db.backref("channel"))
maker_id = db.Column(db.Integer, nullable=False)
class Message(db.Model):
id = db.Column(db.Integer, primary_key=True)
sender_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
sender_username = db.Column(db.String, db.ForeignKey("user.username"), nullable=False)
channel_id = db.Column(db.Integer, db.ForeignKey("channel.id"), nullable=False)
message = db.Column(db.String, default="", nullable=False)
send_on = db.Column(db.String, nullable=False)
edited = db.Column(db.Boolean, default=False)
只需执行以下操作:
class User(db.Model, UserMixin):
...
messages = db.relationship("Message", back_populates="user")
class Channel(db.Model):
...
messages = db.relationship("Message", back_populates="channel")
class Message(db.Model):
...
sender_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
channel_id = db.Column(db.Integer, db.ForeignKey("channel.id"), nullable=False)
user = db.relationship("User", back_populates="messages")
channel = db.relationship("Channel", back_populates="messages")
这样就可以使用user.messages,channel.messages,message.user.username 和 message.user.id.
注意:你也可以使用backref
代替back_populates
,但我建议使用back_populates
,因为它更明确。
我找不到通过 user.messages 和通过 channel.messages[ 获取用户所有消息的方法=27=]。我一直收到外键错误。我需要改变我的人际关系什么才能让它发挥作用?
我希望能够: user.messages 和 channel.messages
作为额外的(如果可能的话): message.user.username 或 message.user.id
我的类:
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
password = db.Column(db.String, nullable=False)
email = db.Column(db.String, unique=True, nullable=False)
admin = db.Column(db.Boolean, default=False)
mc_access = db.Column(db.Boolean, default=False)
pass_recov_code = db.Column(db.String, default=None)
all_messages = db.relationship("Message",
backref=db.backref("Message"),
primaryjoin="foreign(User.id) == remote(Message.sender_id)",
foreign_keys="[User.id, User.username]",
cascade="all, delete"
)
class Channel(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True, nullable=False)
uses_password = db.Column(db.Boolean, default=False)
password = db.Column(db.String)
online_users = db.Column(db.String, default=json.dumps([]))
messages = db.relationship("Message", cascade="all, delete", foreign_keys="[Channel.id]", backref=db.backref("channel"))
maker_id = db.Column(db.Integer, nullable=False)
class Message(db.Model):
id = db.Column(db.Integer, primary_key=True)
sender_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
sender_username = db.Column(db.String, db.ForeignKey("user.username"), nullable=False)
channel_id = db.Column(db.Integer, db.ForeignKey("channel.id"), nullable=False)
message = db.Column(db.String, default="", nullable=False)
send_on = db.Column(db.String, nullable=False)
edited = db.Column(db.Boolean, default=False)
只需执行以下操作:
class User(db.Model, UserMixin):
...
messages = db.relationship("Message", back_populates="user")
class Channel(db.Model):
...
messages = db.relationship("Message", back_populates="channel")
class Message(db.Model):
...
sender_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
channel_id = db.Column(db.Integer, db.ForeignKey("channel.id"), nullable=False)
user = db.relationship("User", back_populates="messages")
channel = db.relationship("Channel", back_populates="messages")
这样就可以使用user.messages,channel.messages,message.user.username 和 message.user.id.
注意:你也可以使用backref
代替back_populates
,但我建议使用back_populates
,因为它更明确。