flask_sqlalchemy python3.9+ 的关系

relationship for flask_sqlalchemy python3.9+

我找不到通过 user.messages 和通过 channel.messages[ 获取用户所有消息的方法=27=]。我一直收到外键错误。我需要改变我的人际关系什么才能让它发挥作用?

我希望能够: user.messageschannel.messages

作为额外的(如果可能的话): message.user.usernamemessage.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.usernamemessage.user.id.

注意:你也可以使用backref代替back_populates,但我建议使用back_populates,因为它更明确。