1

SQLAlchemy と Flask でFacebook スタイルのメッセージング システム (このhttp://www.9lessons.info/2013/05/message-conversation-database-design.htmlに基づく) を作成するにはどうすればよいですか? これが現在の私のモデルですが、あいまいな外部キーエラーが発生し続けています。会話テーブルに基づいていると思います。

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    password = db.Column(db.String(12), unique=False)
    conversation = db.relationship('Conversation',backref='user',lazy='dynamic')
    conversation_reply = db.relationship('Conversation_Reply',backref='user',lazy='dynamic')

class Conversation(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user1 = db.Column(db.Integer, db.ForeignKey("user.id"))
    user2 = db.Column(db.Integer, db.ForeignKey("user.id"))
    timestamp = db.Column(db.DateTime)
    conversation_reply = db.relationship('Conversation_Reply',backref='conversation',lazy='dynamic')

class Conversation_Reply(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    reply = db.Column(db.Text)
    user_id_fk = db.Column(db.Integer, db.ForeignKey("user.id"))
    time = db.Column(db.DateTime)
    c_id_fk = db.Column(db.String(11), db.ForeignKey("conversation.id"))
4

1 に答える 1

1

ユーザーが user1 または user2 の場合に、両方の会話を取得するために参加条件を指定する必要がある場合は、次のようにすることができます。

class User(db.Model):
    # ...
    # Converstations where either user1 or user2 is this user.
    all_conversations = db.relationship('Conversation',
        primaryjoin='or_(User.id == Conversation.user1_id, User.id == ' \
        'Conversation.user2_id)', lazy='dynamic')
    # Replies where this is this user.
    replies = db.relationship("Reply", backref="user")

class Conversation(db.Model):
    # ...
    user1_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    user2_id = db.Column(db.Integer, db.ForeignKey("user.id"))        
    user1 = db.relationship('User', foreign_keys=[user1_id], 
        backref='conversations_as_user1')       
    user2 = db.relationship('User', foreign_keys=[user2_id], 
        backref='conversations_as_user2')
    # Replies to this conversation.
    replies = db.relationship("Reply", backref="conversation")

class Reply(db.Model):
    # ...
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    conversation_id = db.Column(db.Integer, db.ForeignKey("conversation.id"))

会話を開始したユーザーに基づいてfrom_user、user1 と user2 を変更することができます。to_user

于 2013-08-11T00:10:23.813 に答える