繁体   English   中英

flask_sqlalchemy python3.9+的关系

[英]relationship for flask_sqlalchemy python3.9+

我找不到通过user.messages和通过channel.messages从用户获取所有消息的方法。 我一直收到外键错误。 我需要对我的人际关系做出哪些改变才能使其发挥作用?

我希望能够: 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.messageschannel.messagesmessage.user.usernamemessage.user.id

注意:您也可以使用backref而不是back_populates ,但我建议使用back_populates因为它更明确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM