2014-04-12 24 views
7

Cách thích hợp để thiết kế một ba chiều nhiều-nhiều trong bình phương sqlalchemy là gì?Làm thế nào để mối quan hệ nhiều-nhiều-nhiều trong bình phương-sqlalchemy

Giả sử tôi có người dùng, nhóm và vai trò. Người dùng được chỉ định cho các nhóm. Khi được gán cho một nhóm, người dùng cũng được chỉ định vai trò trong nhóm đó.

from myapp import db 

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(128), unique=True) 

    def __init__(self, name): 
     self.name = name 

    def __repr__(self): 
     return "<User(%s)>" % self.name 

class Team(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(128), unique=True) 

    def __init__(self, name): 
     self.name = name 

    def __repr__(self): 
     return "<Team(%s)>" % self.name 

class Role(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(128), unique=True) 

    def __init__(self, name): 
     self.name = name 

    def __repr__(self): 
     return "<Role(%s)>" % self.name 

Một số phương pháp thiết kế bảng proxy cho điều này đã không thành công đối với tôi. Tôi nghĩ rằng tôi hiểu lầm các tài liệu và do đó không muốn gây nhầm lẫn bạn với tất cả các phương pháp tiếp cận thất bại tôi đã thực hiện, cho đến nay.

Tôi muốn để nó bằng câu hỏi: Cách thích hợp để thiết kế mối quan hệ nhiều-nhiều-nhiều ba chiều trong bình phương sqlalchemy là gì.

Trả lời

9

Sau nhiều nghiên cứu và đào, dường như cuối cùng tôi đã tìm thấy câu trả lời. Vì tôi đã tìm thấy nhiều bit và phần của những người khác gặp khó khăn trong việc giải quyết vấn đề này và không thể tìm thấy câu trả lời hoàn chỉnh và rõ ràng, tôi nghĩ tôi có thể đăng nó ở đây cho những du khách tương lai.

Nếu bạn đã đạt được câu hỏi này, có thể bạn không thực sự đang tìm kiếm ba chiều nhiều người. Tôi nghĩ là tôi, nhưng tôi thì không.

Tóm tắt: Tôi có người dùng, nhóm và vai trò. Nếu người dùng tham gia một nhóm, anh ta cũng được chỉ định một vai trò trong nhóm đó.

tôi quay trở lại đầu-board và vẽ những gì tôi thực sự muốn:

+---------+---------+---------+ 
| user_id | team_id | role_id | 
+---------+---------+---------+ 
|  1 |  1 |  1 | 
+---------+---------+---------+ 

Sau đó, nó bắt đầu trở nên rõ ràng với tôi, rằng tôi đã không thực sự tìm kiếm một ba chiều nhiều-to -many, nhưng thay vào đó là một cách ba chiều từ một người ra khỏi mô hình thứ nhất.

class Membership(db.Model): 
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True) 
    team_id = db.Column(db.Integer, db.ForeignKey('team.id'), primary_key=True) 
    role_id = db.Column(db.Integer, db.ForeignKey('role.id'), primary_key=True) 

    db.UniqueConstraint('user_id', 'team_id', 'role_id') 
    db.relationship('User', uselist=False, backref='memberships', lazy='dynamic') 
    db.relationship('Team', uselist=False, backref='memberships', lazy='dynamic') 
    db.relationship('Role', uselist=False, backref='memberships', lazy='dynamic') 

    def __init__(self, user, team, role): 
     self.user_id = user.id 
     self.team_id = team.id 
     self.role_id = role.id 

    def __repr__(self): 
     return "<Membership(%s)>" 

Trường hợp 42: Đây chính là câu trả lời tôi đang tìm kiếm - Tôi vừa hỏi những câu hỏi sai.

+2

sẽ được quan tâm để tìm hiểu cách bạn thêm/sửa đổi/xóa các mục trong mối quan hệ * ternary * này – van

+0

bạn đã sống sót với tôi từ một tìm kiếm dài hạn. cảm ơn :) – CoderInNetwork

Các vấn đề liên quan